Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 funkci Serialize
objektu CArchive
, kde je objekt parametrem volání Serialize
, na rozdíl od použití operátoru << nebo operátoru >> objektu CArchive
. Důležité je mít na paměti, že operátor CArchive
>> sestaví CObject
v paměti na základě informací, které byly dříve zapsány do souboru uložením archivu CRuntimeClass
.
Proto to, zda používáte operátory CArchive
<< a >> nebo volání Serialize
, závisí na tom, zda potřebujete načtení archivu dynamicky rekonstruovat objekt na základě dříve uložených CRuntimeClass
informací.
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čítejte pomocí funkce Serialize
, nebo neukládejte pomocí funkce Serialize
a pak načítejte pomocí operátoru CArchive >>
.
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 vaše serializovatelná třída definuje vložený CObject
jako člena, neměli byste pro tento objekt používat operátory CArchive
a <<, ale měli byste místo toho zavolat funkci >>. Také, pokud serializovatelná třída definuje ukazatel na CObject
(nebo objekt odvozený z CObject
) jako člen, ale vytvoří tento druhý objekt ve svém vlastním konstruktoru, měli byste také zavolat Serialize
.