Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Przechowywanie i ładowanie CObjectplików za pośrednictwem archiwum wymaga dodatkowej uwagi. W niektórych przypadkach należy wywołać funkcję Serialize obiektu, gdzie obiekt CArchive jest parametrem wywołania Serialize, w przeciwieństwie do używania operatora << lub >> obiektu CArchive. Należy pamiętać, że operator CArchive>> konstruuje element CObject w pamięci na podstawie CRuntimeClass informacji zapisanych wcześniej w pliku przez archiwum magazynujące.
W związku z tym, czy używasz CArchive<< operatorów i >> , a nie wywoływania Serialize, zależy od tego, czy potrzebujesz archiwum ładowania, aby dynamicznie odtworzyć obiekt na podstawie wcześniej przechowywanych CRuntimeClass informacji. Użyj funkcji Serialize w następujących przypadkach:
Podczas deserializacji obiektu wcześniej znasz dokładną klasę obiektu.
Podczas deserializacji obiektu masz już przydzieloną dla niego pamięć.
Ostrzeżenie
Jeśli załadujesz obiekt przy użyciu Serialize funkcji, musisz również zapisać obiekt przy użyciu Serialize funkcji . Nie należy przechowywać przy użyciu CArchive<< operatora , a następnie ładować przy użyciu Serialize funkcji lub przechowywać przy użyciu Serialize funkcji, a następnie ładować za pomocą CArchive >> operatora .
Poniższy przykład ilustruje przypadki:
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
}
}
Podsumowując, jeśli klasa z możliwością serializacji definiuje osadzony CObject jako element członkowski, nie należy używać operatorów CArchive<< i >> dla tego obiektu, ale należy wywołać funkcję Serialize. Ponadto, jeśli klasa z możliwością serializacji definiuje wskaźnik do CObject (lub obiektu pochodnego z klasy CObject) jako członka, a tworzy ten inny obiekt we własnym konstruktorze, należy również wywołać metodę Serialize.