次の方法で共有


アーカイブを使用した CObject の格納と読み込み

アーカイブを使用して CObjectを格納および読み込むには、追加の考慮事項が必要です。 場合によっては、SerializeCArchive演算子または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
   }
}

要約すると、シリアル化可能なクラスで埋め込みCObjectがメンバーとして定義されている場合は、そのオブジェクトに対してCArchive演算子と<<演算子を使用>>、代わりに Serialize 関数を呼び出す必要があります。 また、シリアル化可能なクラスがメンバーとして CObject (または CObject から派生したオブジェクト) へのポインターを定義しているが、独自のコンストラクターでこの他のオブジェクトを構築する場合は、 Serializeも呼び出す必要があります。

こちらも参照ください

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