Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
Библиотека классов Microsoft Foundation (MFC) продолжает поддерживаться. Однако мы больше не добавляем функции или обновляем документацию.
Для хранения и загрузки CObject через архив требуется дополнительное внимание. В некоторых случаях вместо использования оператора Serialize или CArchive объекта Serialize следует вызвать функцию << объекта, где объект >> является параметром вызова CArchive. Важно помнить, что оператор CArchive>> создает CObject в памяти на основе CRuntimeClass, ранее записанной в файл этим архивом.
Таким образом, следует ли использовать операторы CArchive<< или делать вызов >>, зависит от того, требуется ли архив загрузки для динамического восстановления объекта на основе ранее хранимых Serialize сведений. Используйте функцию 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
}
}
В общем, если сериализуемый класс определяет внедренный CObject как член, то не следует использовать оператор , CArchive и << для этого объекта, а следует вызывать функцию >>. Кроме того, если сериализуемый класс определяет указатель на CObject (или объект, производный от CObject) в качестве члена, но создает этот другой объект в своем собственном конструкторе, следует также вызвать Serialize.