MFCカスタムクラスのシリアル化イネーブル方法

2522 ワード

一、MFCはオブジェクトがプログラム運行の全過程で持続化するシリアル化機構を許可する
(1)シリアル化とは、ディスクファイルなどの永続化された記憶媒体のオブジェクトの読み取りまたは書き込みを指すプロセスである.
(2)シリアル化は、プログラム実行時またはその後に、C++クラスや構造などの構造化データの状態を修復するために用いられる.
(3)MFCは,CObjectクラスでのシリアル化をサポートしているので,CObjectに継承されているすべてのクラスは,CObjectのシリアル化プロトコルを利用することができる.
(4)シリアル化の基本思想:
a、オブジェクトは、通常、メンバー変数で実装される永続化ストレージメディアに現在の状態を書き込むことができる必要があります.
b、オブジェクトは、読み取りまたは逆シーケンス化によって記憶媒体からオブジェクトの状態を再構築することができる.
c、すべてのオブジェクトポインタの詳細をシリアル化し、オブジェクトをシーケンス化する際のオブジェクトへのループ参照を処理する.
d、キーポイントは、オブジェクト自身が読み取りと書き込みを担当する状態であるため、オブジェクトをシーケンス化する際には、基本的なシーケンス化操作を考えなければならない.
(5)MFCは,CArchiveクラスのオブジェクトをシーケンス化されたオブジェクトと記憶媒体との間の中間媒体として用いる.
二、シリアル化可能なクラスを生成するには
(1) Derive your class from CObject. (ベースクラスがCObjectであるクラスを定義する)
class CGraph : public CObject

(2) Override the Serialize member function.(シリアル関数の書き換え)
void Serialize(CArchive &ar); //(2)         

(3) Use the DECLARE_SERIAL macro in the class declaration.(クラス宣言ファイルでDECLARE_SERIALマクロを使用)
DECLARE_SERIAL(Graph)  //(3)         DECLARE_SERIAL   

(4) Define a constructor with no arguments (a default constructor).(パラメータなしのコンストラクタを定義)
Graph(); //(4)              

(5) Use the IMPLEMENT_SERIAL macro in the class implementation file.(実装ファイルでIMPLEMENT_SERIALマクロを使用)
IMPLEMENT_SERIAL(Graph, CObject, 1) //(5)        IMPLEMENT_SERIAL   

三、実例
Graph.hファイル:
#pragma once
// Graph     
class Graph : public CObject  //(1)       COject  
{
	DECLARE_SERIAL(Graph)  //(3)         DECLARE_SERIAL 
public:
	Graph(); //(4)            
	Graph(int drawType, CPoint ptOld);
	virtual ~Graph();
	void Serialize(CArchive &ar); //(2)       
private:
	int m_drawType;
	CPoint m_ptOld;
};

// Graph.cpp :     
//

#include "stdafx.h"
#include "Archive.h"
#include "Graph.h"


// Graph

IMPLEMENT_SERIAL(Graph, CObject, 1) //(5)        IMPLEMENT_SERIAL 

Graph::Graph() //(4)            
{
}

Graph::Graph(int drawType, CPoint ptOld)
{
	this->m_drawType = drawType;
	this->m_ptOld = ptOld;
}

Graph::~Graph()
{
}

// Graph     
void Graph::Serialize(CArchive &ar) //(2)       
{
	if (ar.IsStoring())
	{
		ar<<m_drawType<<m_ptOld;
	}
	else
	{
		ar>>m_drawType>>m_ptOld;
	}
}

ソース: