次の方法で共有


アーカイブを通じた CObject の格納と読み込み

アーカイブによって CObjectの保存と読み込みの秒は追加の考慮事項が必要です。特定の場合、 CArchive のオブジェクトが CArchive<< または >> 演算子の使用に対して Serialize の呼び出しのパラメーターであるオブジェクトの Serialize の関数をダイヤルする必要があります。注意する重要なことは CArchive>> の演算子が前のアーカイブに格納してファイルに書き込む CRuntimeClass の情報に基づいてメモリの CObject を構築することです。

したがって CArchive<< を使用する Serializeを呼び出すことと >> の演算子やどうか、読み込みのアーカイブが動的に前に CRuntimeClass の格納された情報に基づいてオブジェクトを再構築することを 必要とする かどうかによって異なります。Serialize の関数を、次の場合に使用する:

  • オブジェクトを逆シリアル化する場合は、オブジェクトの厳密のクラスがあらかじめわかっています。

  • オブジェクトを逆シリアル化する場合、既にの割り当てられたメモリがあります。

Caution メモ注意

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<<>> の演算子を使用しないでください Serialize の代わりに、関数をダイヤルする必要があります。またはシリアル化可能なクラスが CObject (または CObjectから派生したオブジェクト)のメンバーもポインターを定義する場合は、独自のコンストラクターの、この他のオブジェクトをまたは Serializeをダイヤルする必要がある構築します。

参照

概念

シリアル化 : オブジェクトのシリアル化