Sdílet prostřednictvím


Ukládání a načítání prostřednictvím archiv CObjects

Ukládání a načítání CObjects prostřednictvím archiv vyžaduje zvláštní pozornost.V určitých případech by měl zavolat Serialize funkci objektu, kde CArchive parametr je objekt Serialize volání jako protiklad k použití << nebo >> provozovatel CArchive.Je důležité skutečnost mějte na paměti, že CArchive>> operátor konstrukce CObject v paměti založené na CRuntimeClass dříve zapsána do souboru archivu ukládání informací.

Proto, zda používáte CArchive<< a >> operátory porovnání volací Serialize, závisí na tom, zda jste třeba načítání archivu dynamicky rekonstruovat objekt založen na dříve uložených CRuntimeClass informace.Použití Serialize funkce v následujících případech:

  • Při rušení serializace objektu, víte přesně třídu objektu předem.

  • Při rekonstrukci objektu již přidělené paměti pro něj.

Poznámka k upozorněníUpozornění

Pokud načtete pomocí objektu Serialize funkce, musí ukládat pomocí objektu Serialize funkce.Neukládejte pomocí CArchive<< operátor a potom pomocí zatížení Serialize funkce nebo ukládat pomocí Serialize funkci a poté načíst pomocí CArchive >> operátor.

Následující příklad ukazuje případy:

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

Souhrn serializovatelné třídy definuje vložený v CObject jako člen by není použít CArchive<< a >> operátory pro tento objekt ale by měl zavolat Serialize namísto funkce.Také pokud serializovatelné třídy určuje ukazatel na CObject (nebo objekt odvozené z CObject) jako člen, ale konstrukce tohoto objektu v jeho vlastní konstruktoru také volat Serialize.

Viz také

Koncepty

Serializace: Serializaci objektu