CObjects über ein Archiv speichern und Laden

Zum Speichern und Laden von CObject s über ein Archiv erfordert weitere Überlegung.In bestimmten Fällen sollten Sie die Serialize-Funktion des Objekts ermitteln, in dem sich das Objekt CArchive einen Parameter des Serialize Aufrufs, im Gegensatz zur Anwendung des Operators >> oder <<CArchive ist.Der wichtige beachten Tatsache, dass der Operator CArchive>>CObject im Arbeitsspeicher auf Grundlage CRuntimeClass Informationen erstellt, die zuvor vom speichernde Archiv in die Datei geschrieben sind.

Daher ob Sie CArchive<< verwenden und >>-Operatoren, gegen das Aufrufen von Serialize, hängt davon ab, ob Sie das Laden archiv benötigen, um das Objekt auf Grundlage zuvor gespeicherte CRuntimeClass Informationen dynamisch neu zu erstellen.Verwenden Sie die Serialize-Funktion in den folgenden Fällen:

  • Wenn Sie das Objekt deserialisieren, kennen Sie die genaue Klasse des Objekts.

  • Wenn Sie das Objekt deserialisieren, verfügen Sie bereits den Arbeitsspeicher, der für sie zugeordnet ist.

WarnhinweisVorsicht

Wenn Sie das Objekt mithilfe der Serialize-Funktion laden, müssen Sie das Objekt mithilfe der Serialize-Funktion speichern.Speichern Sie keine << mithilfe des Operators CArchive und laden Sie dann mit der Serialize-Funktion oder des Speichers mithilfe der Serialize-Funktion, und laden Sie dann mit CArchive >>-Operators.

Das folgende Beispiel veranschaulicht die Fälle:

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
   }
}

Zusammenfassend wenn die serialisierbare Klasse eingebettetes CObjec t als Member definiert, sollten Sie CArchive<< und >>-Operatoren für dieses Objekt nicht verwenden, sondern stattdessen sollten die Serialize-Funktion aufrufen.Auch wenn die serialisierbare Klasse einen Zeiger auf CObject (oder auf ein Objekt abgeleitet von CObject) als Member definiert, sondern erstellt das andere Objekt in seinem eigenen Konstruktor, müssen Sie auch Serialize aufrufen.

Siehe auch

Konzepte

Serialisierung: Serialisieren eines Objekts