Udostępnij za pośrednictwem


Przechowywanie i ładowanie CObjects za pośrednictwem archiwum

Przechowywanie i ładowanie CObjects za pośrednictwem archiwum wymaga dodatkowych.W niektórych przypadkach należy wywołać Serialize funkcji obiektu, gdy CArchive obiekt jest parametr Serialize rozmowy, w przeciwieństwie do użycia << lub >> operator CArchive.Jest ważne fakt, należy pamiętać o CArchive>> konstrukcje operator CObject w pamięci na podstawie CRuntimeClass informacje poprzednio zapisane do pliku przez przechowywanie archiwum.

W związku z tym, czy używać CArchive<< i >> operatorów kontra calling Serialize, zależy od tego, czy użytkownik muszą archiwum załadunku dynamicznie odtworzenie obiektu na podstawie przechowywanych wcześniej CRuntimeClass informacji.Użyj Serialize funkcji w następujących przypadkach:

  • Podczas deserializacji obiektu, wiadomo dokładnie klasy obiektu z góry.

  • Podczas deserializacji obiektu, masz już pamięć przydzielona dla niego.

Informacje dotyczące przestrogiPrzestroga

Jeśli obiekt za pomocą Serialize funkcji, muszą być również przechowywane przy użyciu obiektu Serialize funkcji.Nie należy przechowywać za pomocą CArchive<< operator, a następnie przy użyciu obciążenia Serialize funkcji lub przechowywania za pomocą Serialize działać, a następnie załadować za pomocą CArchive >> operatora.

Poniższy przykład ilustruje przypadkach:

class CMyObject : public CObject
{
// ...Member functions
public:
   CMyObject() { }
   virtual void Serialize( CArchive& ar );

// Implementation
protected:
   DECLARE_SERIAL( CMyObject )
};


class COtherObject : public CObject
{
   // ...Member functions
public:
   COtherObject() { }
   virtual void Serialize( CArchive& ar );

// Implementation
protected:
   DECLARE_SERIAL( COtherObject )
};


class CCompoundObject : public CObject
{
   // ...Member functions
public:
   CCompoundObject();
   ~CCompoundObject();
   virtual void Serialize( CArchive& ar );

// Implementation
protected:
   CMyObject m_myob;    // Embedded object
   COtherObject* m_pOther;    // Object allocated in constructor
   CObject* m_pObDyn;    // Dynamically allocated object
   //..Other member data and implementation

   DECLARE_SERIAL( CCompoundObject )
};
IMPLEMENT_SERIAL(CMyObject,CObject,1)
IMPLEMENT_SERIAL(COtherObject,CObject,1)
IMPLEMENT_SERIAL(CCompoundObject,CObject,1)


CCompoundObject::CCompoundObject()
{
   m_pOther = new COtherObject; // Exact type known and object already 
            //allocated.
   m_pObDyn = NULL;    // Will be allocated in another member function
            // if needed, could be a derived class object.
}

CCompoundObject::~CCompoundObject()
{
   delete m_pOther;
}

void CCompoundObject::Serialize( CArchive& ar )
{
   CObject::Serialize( ar );    // Always call base class Serialize.
   m_myob.Serialize( ar );    // Call Serialize on embedded member.
   m_pOther->Serialize( ar );    // Call Serialize on objects of known exact type.

   // Serialize dynamic members and other raw data
   if ( ar.IsStoring() )
   {
      ar << m_pObDyn;
      // Store other members
   }
   else
   {
      ar >> m_pObDyn; // Polymorphic reconstruction of persistent object 
      //load other members
   }
}

Podsumowując, jeżeli możliwy do serializacji klasa definiuje osadzony CObject jako członek powinien nie używać CArchive<< i >> podmioty tego obiektu, ale powinna wywołać Serialize zamiast działać.Ponadto jeśli możliwy do serializacji klasa definiuje wskaźnik do CObject (lub pochodną obiektu CObject) jako członka, ale konstrukcje tego obiektu w jego własnych konstruktora można również zadzwonić Serialize.

Zobacz też

Koncepcje

Szeregowanie: Szeregowania obiektu