アーカイブを通じた CObject の格納と読み込み
アーカイブして CObjects を格納および読み込むと、余分な事項を考慮する必要があります。 特定のシナリオでは、CArchive オブジェクトが CArchiveの << または >> の演算子の使用に対して Serialize の呼び出しのパラメーターであるオブジェクトの Serialize 関数を呼び出す必要があります。 考慮する必要がある重要なことは CArchive >> の演算子が以前に保存のアーカイブしてファイルに書き込む CRuntimeClass 情報に基づいてメモリの CObject を構築することです。
したがって 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を呼び出すようにします。