アーカイブを通じた CObject の格納と読み込み
アーカイブを使用した CObject
の格納と読み込みには、別途考慮が必要です。 場合によっては、オブジェクトの Serialize
関数を呼び出す必要があります。その場合は、CArchive
の << または >> 演算子を使用するのとは対照的に、CArchive
オブジェクトが Serialize
呼び出しのパラメーターになります。 注意すべき重要な点は、格納アーカイブによって以前にファイルに書き込まれた CRuntimeClass
情報に基づいて、CArchive
>> 演算子がメモリ内で CObject
を構築することです。
そのため、Serialize
の呼び出しに対して CArchive
<< 演算子と >> 演算子を使用するかどうかは、以前に格納された 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
を呼び出す必要があります。