シリアル化 : シリアル化可能なクラスの作成
クラスをシリアル化可能にするには、主に 5 つの手順が必要です。 以下に示し、次のセクションで説明します。
CObject (または から 派生したクラス) からクラスを派生します 。
クラス宣言DECLARE_SERIALマクロ を使用します。
CArchive の 演算子と 演算子を使用するのではなく、 を直接呼び出す場合、シリアル化には最後の 3 つの Serialize>><< 手順は必要ありません。 Serialize
CObject からのクラスの派生
基本的なシリアル化プロトコルと機能は、 クラスで定義 CObject されています。 クラスの次の宣言に示すように、 から (または から派生したクラスから) クラスを派生すると、 のシリアル化プロトコルと機能に CObjectCObjectCPerson アクセスできます CObject 。
Serialize メンバー関数のオーバーライド
クラスで定義されているメンバー関数は、オブジェクトの現在の状態をキャプチャするために必要なデータを実際にシリアル SerializeCObject 化する必要があります。 関数 Serialize には、オブジェクト CArchive データの読み取りおよび書き込みに使用する引数があります。 CArchive オブジェクトには、格納 (データの書き込み) と読み込み (データの読み取り) のどちらを行うのかを示すメンバー関数 Serialize があります。 の結果をガイドとして使用して、挿入演算子 ( ) を使用してオブジェクトのデータを オブジェクトに挿入するか、抽出演算子 ( ) を使用してデータ IsStoringCArchive<< を抽出します >> 。
から派生し、型と WORD の 2 つの新しいメンバー変数 CObject を持つクラス CString について CObject。 次のクラス宣言フラグメントは、新しいメンバー変数とオーバーライドされたメンバー関数の宣言を 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 メンバー関数をオーバーライドするには
オブジェクトの継承された部分がシリアル化されるのを確認するには、 の基本クラス バージョン
Serializeを呼び出します。クラスに固有のメンバー変数を挿入または抽出します。
挿入演算子と抽出演算子は、アーカイブ クラスと対話してデータの読み取りおよび書き込みを行います。 次の例は、上記で宣言された
SerializeクラスにをCPerson実装する方法を示しています。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 では、オブジェクトが逆シリアル化 (ディスクから読み込まれる) ときにオブジェクトを再作成するときに、既定のコンストラクターが必要です。 逆シリアル化プロセスでは、すべてのメンバー変数に、オブジェクトの再作成に必要な値が入力されます。
このコンストラクターは、public、protected、または private として宣言できます。 保護またはプライベートにする場合は、シリアル化関数によってのみ使用されるのを確認するのに役立ちます。 コンストラクターは、必要に応じてオブジェクトを削除できる状態にする必要があります。
注意
DECLARE_SERIAL マクロと IMPLEMENT_SERIAL マクロを使用するクラスで引数を持つコンストラクターを定義し忘れた場合は、IMPLEMENT_SERIAL マクロが使用される行に対して "既定のコンストラクターを使用できません" というコンパイラ警告が表示されます。
実装ファイルIMPLEMENT_SERIALマクロの使用
このIMPLEMENT_SERIALは、 からシリアル化可能なクラスを派生させるときに必要なさまざまな関数を定義するために使用されます CObject 。 このマクロは、実装ファイル () で使用します。クラスの CPP)。 マクロの最初の 2 つの引数は、 クラスの名前と、その直接の基本クラスの名前です。
このマクロの 3 番目の引数はスキーマ番号です。 スキーマ番号は、基本的に クラスのオブジェクトのバージョン番号です。 スキーマ番号には 0 以上の整数を使用します。 (このスキーマ番号とデータベース用語を混同して使用してください)。
MFC シリアル化コードは、オブジェクトをメモリに読み込むときにスキーマ番号をチェックします。 ディスク上のオブジェクトのスキーマ番号がメモリ内のクラスのスキーマ番号と一致しない場合、ライブラリは をスローし、プログラムがオブジェクトの正しくないバージョンを読み取るのを CArchiveException 妨げる原因になります。
メンバー関数で複数のバージョン (つまり、異なるバージョンのアプリケーションで書き込まれたファイル) を読み取る場合は、値 VERSIONABLE_SCHEMA を IMPLEMENT_SERIAL マクロの引数 Serialize—— として使用Serializeできます。 使用状況情報と例については、 クラスのメンバー GetObjectSchema 関数を参照してください CArchive 。
次の例は、 から派生IMPLEMENT_SERIALクラスに対してメソッドを使用 CPerson する方法を示しています CObject 。
IMPLEMENT_SERIAL(CPerson, CObject, 1)
シリアル化可能なクラスを作成したら、「シリアル化: オブジェクトのシリアル化」の記事で説明したように、 クラスのオブジェクト をシリアル化できます。