Speichern und Laden eines CObject per Archiv
Das Speichern und Laden CObject
von S über ein Archiv erfordert zusätzliche Überlegungen. In bestimmten Fällen sollten Sie die Serialize
Funktion des Objekts aufrufen, wobei das CArchive
Objekt ein Parameter des Serialize
Aufrufs ist, im Gegensatz zur Verwendung des << Oder >> Operators der CArchive
. Die wichtige Tatsache, dass der CArchive
>> Operator den CObject
Speicher basierend auf CRuntimeClass
Informationen erstellt, die zuvor durch das Speichern des Archivs in die Datei geschrieben wurden.
Daher hängt davon ab, ob Sie das<< >> CArchive
Ladenarchiv verwenden, um das Objekt basierend auf zuvor gespeicherten Serialize
CRuntimeClass
Informationen dynamisch zu rekonstruieren. Verwenden Sie die Serialize
Funktion in den folgenden Fällen:
Beim Deserialisieren des Objekts kennen Sie die genaue Klasse des Objekts vorher.
Beim Deserialisieren des Objekts haben Sie bereits Arbeitsspeicher zugewiesen.
Achtung
Wenn Sie das Objekt mithilfe der Serialize
Funktion laden, müssen Sie das Objekt auch mithilfe der Serialize
Funktion speichern. Speichern CArchive
<< Sie den Operator nicht, und laden Sie dann die Serialize
Funktion, oder speichern Serialize
Sie die Funktion, und laden Sie dann den CArchive >>
Operator.
Das folgende Beispiel veranschaulicht die Fälle:
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
}
}
Wenn Ihre serialisierbare Klasse eine eingebettete CObject
Klasse als Element definiert, sollten Sie nicht die CArchive
<< Operatoren und >> Operatoren für dieses Objekt verwenden, sondern stattdessen die Serialize
Funktion aufrufen. Wenn ihre serialisierbare Klasse einen Zeiger auf ein CObject
(oder von ) abgeleitetes CObject
Objekt als Element definiert, aber dieses andere Objekt in seinem eigenen Konstruktor erstellt, sollten Sie auch aufrufen Serialize
.