シリアル化 : シリアル化可能なクラスの作成
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 またはプライベートこれを行った場合、シリアル化の関数によってのみ使用されることを確認できます。コンストラクターは状態に割り当て、必要に応じて削除するには、そのオブジェクトを配置する必要があります。
[!メモ]
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 )
シリアル化可能なクラスがある場合、技術情報 シリアル化: オブジェクトのシリアル化に説明されているように、クラスのオブジェクトをシリアル化できます。