シリアル化 : シリアル化可能なクラスの作成
5 個の主要手順がクラスをシリアル化可能にする必要があります。 こうしたプロパティは、次の一覧に、次のセクションで説明する場合:
CObject からクラスを派生すること (または CObjectから派生したクラスの一部)。
シリアル化するのメンバー関数のオーバーライド。
クラス宣言のDECLARE_SERIAL マクロを使用します。。
引数を受け取らないコンストラクターを定義します。
クラスの実装ファイルの IMPLEMENT_SERIAL マクロを使用して。
CArchiveと演算子を使わず Serialize を >> 直接 << 呼び出すと、最後の手順 3 はシリアル化に必要はありません。
CObject からクラスを派生すること
基本的なシリアル化プロトコルと機能は CObject クラスに定義されます。 クラス CPersonの次の宣言に示すように、CObject からクラス (または CObjectから派生したクラス) から派生することで、CObjectのシリアル化のプロトコルと機能にアクセスするために使用できます。
シリアル化するのメンバー関数のオーバーライド
CObject クラスで定義されて Serialize のメンバー関数が実際にオブジェクトの現在の状態を取得するために必要なデータをシリアル化する必要があります。 Serialize 関数を読み取るために使用される、オブジェクト データを書き込みます CArchive の引数。 CArchive オブジェクトに Serialize (データの書き込み) に格納したり、読み込んでいるかどうかを示すメンバー関数、IsStoringがあります (データの読み取り)。 ガイドとして IsStoring の結果を使用して、ストリーム演算子 (>>) の出力ストリーム演算子 (<<) またはデータを抽出するの CArchive オブジェクトでオブジェクト データを挿入します。
CObject から派生され、2 種類の新しいメンバー変数の型 CString と WORDクラスについて考えます。 次のクラス宣言のフラグメントは Serialize のオーバーライドされたメンバー関数の新しいメンバー変数と宣言を示します:
class CPerson : public CObject
{
public:
DECLARE_SERIAL( CPerson )
// empty constructor is necessary
CPerson();
virtual ~CPerson();
CString m_name;
WORD m_number;
void Serialize( CArchive& archive );
};
シリアル化するのメンバー関数をオーバーライドするには
オブジェクトの継承された部分がシリアル化されるようにするに Serialize の基本クラス バージョンを呼び出します。
クラスに固有のメンバー変数を追加または取得します。
挿入および抽出の演算子がアーカイブ クラスとデータの読み取りと書き込みのために対話します。 次の例は、上に宣言された CPerson クラスの Serialize を実装する方法を示します。:
void CPerson::Serialize( CArchive& archive ) { // call base class function first // base class is CObject in this case CObject::Serialize( archive ); // now do the stuff for our specific class if( archive.IsStoring() ) archive << m_name << m_number; else archive >> m_name >> m_number; }
また、大量の型指定されていないデータの読み書きに CArchive::Read と CArchive::Write メンバー関数を使用できます。
DECLARE_SERIAL マクロを使用します。
DECLARE_SERIAL マクロは、シリアル化をサポートするクラスの宣言に、次に示すように、必要があります:
class CPerson : public CObject
{
public:
DECLARE_SERIAL( CPerson )
引数なしのコンストラクターの定義
MFC は逆シリアル化されているオブジェクトを再作成するときの既定のコンストラクターが必要です (ディスクから読み込まれて)。 シリアル化解除はオブジェクトを再作成するために必要な値のすべてのメンバー変数を指定します。
このコンストラクターは、プライベート宣言されたパブリック、Protected である場合があります。 protected またはプライベートな、シリアル化を行う関数だけで使用されることを確認できます。 コンストラクターは、必要に応じて削除するその状態にオブジェクトを配置する必要があります。
注意
DECLARE_SERIAL と IMPLEMENT_SERIAL マクロを使用してクラスの引数を持たないコンストラクターが定義されていない場合、「既定のコンストラクターに IMPLEMENT_SERIAL マクロが使用されている行に使用できる」コンパイラの警告を回避できます。
実装ファイルの IMPLEMENT_SERIAL マクロを使用して
CObjectからシリアル化できるクラスを派生すると IMPLEMENT_SERIAL マクロが必要な各種関数を定義するために使用されます。 実装ファイル (.cpp) でクラスにこのマクロを使用します。 マクロに最初の 2 番目の引数は、クラスの名前と、その直接の基本クラスの名前です。
このマクロに 3 番目の引数はスキーマ番号です。 スキーマ番号は主にクラスのオブジェクトのバージョン番号です。 整数を超える使用したり、スキーマ番号の 0 に設定します。(データベース用語でこのスキーマ番号を混同しないでください。
オブジェクトをメモリに読み込むときに MFC のシリアル化コード チェック スキーマ番号。 ディスク上のオブジェクトのスキーマ番号がメモリ クラスのスキーマ番号に一致する、プログラムがオブジェクトの正しいバージョンを読み込むことができない CArchiveExceptionをスローします。
Serialize のメンバー関数の複数のバージョン (アプリケーションの各バージョンで記述された、つまりファイル読めれば—場合 IMPLEMENT_SERIAL マクロに引数として値 VERSIONABLE_SCHEMA を使用できます。 使用方法の例については、CArchiveクラスの GetObjectSchema メンバー関数を参照してください。
次の例に CObjectから派生されるクラスに IMPLEMENT_SERIAL、CPersonの使用方法を説明しています:
IMPLEMENT_SERIAL( CPerson, CObject, 1 )
シリアル化できるクラスがある場合は、文書 シリアル化: オブジェクトのシリアル化"に説明されているように、クラス オブジェクトをシリアル化できます。