データのファイルへのシリアル化
データの保存の基本的な考え方は、オブジェクトが自身の現在の状態 (メンバー変数の値) を 2 次記憶に書き込むことです。 後で、オブジェクトの状態を 2 次記憶から読み出す、つまり "逆シリアル化する" ことで、オブジェクトを復元できます。 ここで重要なのは、オブジェクトが自身の状態の読み書きを行うことです。 つまり、2 次記憶への保存が必要なクラスでは、基本的なシリアル化操作を実装する必要があります。
フレームワークの既定の動作では、[ファイル] メニューの [上書き保存] および [名前を付けて保存] を選択すると、ドキュメントがディスク ファイルに保存されます。[ファイル] メニューの [開く] を選択すると、ディスク ファイルからドキュメントが読み込まれます。 このように、少量の作業でデータとファイルとを読み書きする機能をドキュメントに実装できます。 ここで必要な作業は、ドキュメント クラスで Serialize メンバー関数をオーバーライドすることです。
MFC のアプリケーション ウィザードでは、自動的に作成したドキュメント クラスに、CDocument メンバー関数である Serialize をオーバーライドしたスケルトンが提供されます。 アプリケーションのメンバー変数を実装した後で、Serialize のオーバーライド関数に対して、ファイルに接続されている "アーカイブ オブジェクト" へデータを送るコードを記述できます。 CArchive オブジェクトは、C++ の iostream ライブラリの入出力オブジェクト cin と cout に似ています。 ただし、CArchive での読み書きは、書式化テキスト形式ではなくバイナリ形式で行われます。
さらに詳しくは次のトピックをクリックしてください
シリアル化におけるドキュメントの役割
シリアル化におけるデータの役割
シリアル化におけるドキュメントの役割
フレームワークは、[ファイル] メニューの [開く]、[上書き保存]、および [名前を付けて保存] が選択されると、ドキュメントに Serialize メンバー関数が実装されているときは、この関数を呼び出すことで自動的に応答します。 たとえば、ID_FILE_OPEN コマンドは、アプリケーション オブジェクトのハンドラー関数を呼び出します。 この処理では、表示された [ファイル] メニューの [開く] ダイアログ ボックスでユーザーがファイル名を指定し、フレームワークがユーザーの選択したファイル名を取得します。 フレームワークは、データをドキュメントに読み込むために設定された CArchive オブジェクトを作成し、アーカイブを Serialize に渡します。 この時点で、フレームワークは既にファイルを開いています。 ドキュメントの Serialize メンバー関数のコードはアーカイブ中のデータを読み取り、必要に応じて、データ オブジェクトを再構築します。 シリアル化の詳細については、「シリアル化」を参照してください。
シリアル化におけるデータの役割
一般に、クラス型のデータはそれ自身をシリアル化できる必要があります。 つまり、オブジェクトをアーカイブに渡すときに、自身をアーカイブに書き込む方法と、アーカイブから読み出す方法をオブジェクト自身が認識している必要があります。 MFC では、この方法でクラスをシリアル化できます。 データ型を定義するクラスをデザインし、その型のデータをシリアル化するときは、シリアル化を考慮したデザインを行ってください。