Dela via


Lagring och inläsning av CObjects via ett arkiv

Lagring och inläsning av CObject via ett arkiv kräver extra eftertanke. I vissa fall bör du anropa Serialize-funktionen för objektet, där CArchive-objektet är en parameter för Serialize-anropet, i stället för att använda <<- eller >>-operatorn för CArchive. Det viktiga att tänka på är att operatorn CArchive>> konstruerar CObject i minnet baserat på CRuntimeClass information som tidigare skrivits till filen av lagringsarkivet.

Om du använder operatorerna CArchive<< och >> eller anropar Serializeberor därför på om du behöver inläsningsarkivet för att dynamiskt rekonstruera objektet baserat på tidigare lagrad CRuntimeClass information. Serialize Använd funktionen i följande fall:

  • När du deserialiserar objektet vet du den exakta klassen för objektet i förväg.

  • När objektet deserialiseras har du redan allokerat minne för det.

Försiktighet

Om du läser in objektet med hjälp av Serialize funktionen måste du också lagra objektet med hjälp av Serialize funktionen . Lagra inte med operatorn CArchive<< och läs sedan in med funktionen Serialize eller lagra med hjälp av Serialize funktionen och läs sedan in med operatorn CArchive >> .

I följande exempel visas fallen:

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

Sammanfattningsvis, om din serialiserbara klass definierar en inbäddad CObject som medlem, bör du inte använda operatorerna CArchive<< och >> för objektet, utan anropa Serialize funktionen i stället. Om din serialiserbara klass definierar en pekare till en CObject (eller ett objekt härlett från CObject) som medlem, men konstruerar det andra objektet i klassens egen konstruktor, bör du också anropa Serialize.

Se även

Serialisering: Serialisera ett objekt