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