MFC におけるシリアル化
更新 : 2007 年 11 月
ここでは、Microsoft Foundation Class (MFC) ライブラリのシリアル化機構について説明します。シリアル化は、プログラム終了後もオブジェクトの状態を保存しておき、次にプログラムを実行したときにその状態を復元するための機能です。
シリアル化は、オブジェクトをディスク ファイルなどの 2 次記憶域メディアに対して読み書きする機能です。シリアル化は、プログラムの実行中や実行後に生じた構造化データ (C++ のクラスや構造体など) の状態を保存しておきたい場合に使用します。MFC が備えているシリアル化オブジェクトを使用すると、これを標準的な一貫した方法で行うことができるため、開発者自身が面倒なファイル操作を記述する必要はありません。
MFC では、シリアル化のための組み込みサポートを CObject クラスによって提供しています。したがって、CObject のすべての派生クラスは、CObject のシリアル化操作を利用できます。
シリアル化の基本的なしくみは、オブジェクトが自身の現在の状態 (通常はメンバ変数の値) を自分で 2 次記憶に書き込めるということです。その後で、オブジェクトの状態をストレージから読み取る (逆シリアル化する) ことにより、オブジェクトを再作成できます。シリアル化を行うときは、オブジェクトへのポインタや循環参照の詳細も適切に処理されます。重要なのは、オブジェクト自身が自分の状態を読み書きする機能を持つ必要があるという点です。したがって、シリアル化が必要なクラスには、基本的なシリアル化操作を実装する必要があります。以降のシリアル化関連の各項で説明するように、この機能はクラスに簡単に加えることができます。
MFC では、シリアル化されるオブジェクトと記憶域メディア間のインターフェイスとして CArchive クラスのオブジェクトが使用されます。このオブジェクトは、シリアル化に必要な情報を得るために常に CFile オブジェクトに関連付けられています。CFile オブジェクトによって得られる情報としては、ファイル名、要求された操作 (読み取りまたは書き込み) などがあります。シリアル化操作を行うオブジェクトでは、記憶域メディアの種類に関係なく CArchive オブジェクトを使うことができます。
CArchive オブジェクトは、オーバーロードされた出力ストリーム演算子 (<<) および入力ストリーム演算子 (>>) を使って、書き込みや読み取りの操作を行います。詳細については、「シリアル化 : オブジェクトのシリアル化」の「アーカイブを通じた CObject の格納と読み込み」を参照してください。
メモ : |
---|
CArchive クラスは、汎用入出力ストリーム クラスではありません。入出力ストリーム クラスは書式化されたテキスト専用ですが、CArchive クラスはバイナリ形式でシリアル化されたオブジェクトを扱います。 |
場合によっては、MFC のシリアル化機構を使用せずに、2 次データ記憶の独自の機構を作成することもできます。この場合は、ユーザーがコマンドを実行したときにシリアル化を開始するクラスのメンバ関数をオーバーライドする必要があります。『テクニカル ノート 22: 標準コマンドの実装』の ID_FILE_OPEN、ID_FILE_SAVE、および ID_FILE_SAVE_AS 各標準コマンドについての説明を参照してください。
次の各項では、シリアル化を行うために必要な 2 つの作業について説明します。
「シリアル化 : シリアル化とデータベースの入出力」では、データベース アプリケーションにおいて、入出力手段としてシリアル化を用いるのが適切な場合について解説しています。