Ukládání a načítání objektů CObject prostřednictvím archivu
Ukládání a načítání CObjects pomocí archiv vyžaduje zvláštní pozornost.V některých případech byste měli zavolat Serialize funkce objektu, kde CArchive parametr je objekt Serialize volání, na rozdíl od použití << nebo >> provozovatele CArchive.Je důležité třeba vzít v úvahu skutečnost, že CArchive>> konstrukce operátor CObject v paměti na základě CRuntimeClass informace, které jsou již zapsány do souboru pomocí ukládání archivu.
Tedy, zda použít CArchive<< a >> operátoři versus volací Serialize, závisí na tom, zda jste třeba načítání archivu dynamicky rekonstruovat objekt na základě dříve uložené CRuntimeClass informace. Použití Serialize funkce v následujících případech:
Při rušení serializace objektu, znáte přesné třídy objektu předem.
Při rušení serializace objektu, máte již přidělené paměti pro něj.
![]() |
---|
Při načítání objektu pomocí Serialize funkce, musíte uložit pomocí objektu Serialize funkce.Neukládejte pomocí CArchive<< operátor a potom pomocí zatížení Serialize funkce nebo uložit pomocí Serialize funkce a potom 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
}
}
V souhrnu, pokud vaše třída serializovatelný definuje vložený CObject jako člen, měli byste není použít CArchive<< a >> operátory pro tento objekt by měl zavolat, ale Serialize místo toho pracovat. Také pokud vaše třída serializovatelný definuje ukazatel na CObject (nebo objekt odvozené z CObject) jako člen, ale konstrukce tohoto objektu, v jeho vlastní konstruktor, měli byste také volat Serialize.