И при загрузке CObjects в архив
Сохранение и загрузка CObject s через требуют дополнительного рассмотрения. архивВ некоторых случаях необходимо вызвать функцию Serialize объекта, где объект CArchive параметр вызова Serialize, в отличие от использования оператора << или >>CArchive.Важный факт, который необходимо помнить, что оператор CArchive>> создает CObject в память на основе данных о CRuntimeClass ранее, записанных в файл архивом.
Поэтому, используется ли CArchive<< и операторы >>, и вызывать Serialize, зависит от того, требуется ли возможность загрузить архив динамически для восстановления объекта на основе ранее сохраненных данных по CRuntimeClass.Используйте функцию Serialize в следующих случаях:
Десериализации объекта известен точный класс объекта заранее.
Десериализации объекта, уже есть память, выделенную для него.
Внимание |
---|
При загрузке объекта с помощью функции Serialize также необходимо сохранить объект, используя функцию Serialize.Не храните с помощью оператора CArchive<<, а затем нагружайте с помощью функции Serialize или хранилище с помощью функции Serialize, а затем нагружайте с помощью оператора CArchive >>. |
В следующем примере демонстрируются случаи:
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
}
}
Вкратце, если сериализуемый класс определяет встроенные CObjec t в качестве члена, не следует использовать CArchive<< и операторы >> объекта, но должны вызывать функцию Serialize.Кроме того, если сериализуемый класс определяет указатель на CObject (или объект, производный от CObject) в качестве члена, а другой создает этот объект в собственном конструкторе, также вызвать Serialize.