Ukládání a načítání objektů CObject prostřednictvím archivu
Ukládání a načítání CObject
přes archiv vyžaduje další důležité informace. V některých případech byste měli volat Serialize
funkci objektu, kde CArchive
je objekt parametrem Serialize
volání, na rozdíl od použití << operátoru nebo >> operátoru CArchive
. Důležité je mít na paměti, že CArchive
>> operátor sestaví CObject
v paměti na CRuntimeClass
základě informací dříve zapsaných do souboru uložením archivu.
Proto to, zda používáte a operátory, versus volání Serialize
, závisí na tom, zda potřebujete načítání archiv dynamicky rekonstruovat objekt na základě dříve uložených CRuntimeClass
informací.>> CArchive
<< Serialize
Funkci použijte v následujících případech:
Při deserializaci objektu předem znáte přesnou třídu objektu.
Při deserializaci objektu již máte přidělenou paměť.
Upozornění
Pokud objekt načtete pomocí Serialize
funkce, musíte objekt uložit také pomocí Serialize
funkce. Neukládejte pomocí operátoru CArchive
<< a pak načtěte pomocí Serialize
funkce nebo uložte Serialize
funkci a pak načtěte pomocí CArchive >>
operátoru.
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
}
}
Pokud serializovatelná třída definuje vložený CObject
jako člen, neměli byste použít operátory a >> operátory CArchive
<< pro tento objekt, ale měli byste místo toho volat Serialize
funkci. Také, pokud serializovatelná třída definuje ukazatel na CObject
(nebo objekt odvozený ) CObject
jako člen, ale vytvoří tento druhý objekt v jeho vlastní konstruktoru, měli byste také volat Serialize
.