Поделиться через


Сохранение и загрузка CObjects через архив

Для сохранения и загрузки CObject через архив требуют дополнительного вопроса. В некоторых case, необходимо вызвать функцию 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
   }
}

В сводке, если сериализуемый класс определяет типа t CObjec в качестве члена, не следует использовать CArchive << и операторы >> для данного объекта, но необходимо вызвать функцию Serialize вместо. Также если сериализуемый класс определяет указатель на CObject (или объект, производный от CObject) в качестве члена, но создает этот другой объект в собственном конструкторе, необходимо вызвать Serialize.

См. также

Основные понятия

Сериализация. Сериализация объекта