一、MFC允許對象在程序運行的整個過程中持久化的串行化機制
(1)串行化是指向持久化存儲媒介(如一個磁盤文件)讀或寫對象的過程。
(2)串行化用於在程序運行過程時或之後修復結構化數據(如C++類或結構)的狀態。
(3)MFC支持CObject類中的串行化,所以,所有繼承於CObject的類可以利用CObject的串行化協議。
(4)串行化的基本思想:
a、對象必須能將其當前狀態寫入到持久化存儲媒介中,通常用其成員變量實現。
b、對象可以通過讀或反序列化從存儲媒介中重新構造對象的狀態。
c、串行化處理所有對象指針的細節,以及序列化對象時對對象的循環引用。
d、關鍵點是對象自己負責讀和寫其本身的狀態,所以,序列化一個對象時,必須是想基本的序列化操作。
(5)MFC使用CArchive類的對象作為被序列化的對象和存儲媒介之間的中間媒介。
二、生成一個可串行化的類的步驟
(1) Derive your class from CObject. (定義一個基類為CObject的類)
(2) Override the Serialize member function.(重寫串行化函數)
(3) Use the DECLARE_SERIAL macro in the class declaration.(在類聲明文件中使用DECLARE_SERIAL宏)
(4) Define a constructor with no arguments (a default constructor).(定義一個無參數的構造函數)
(5) Use the IMPLEMENT_SERIAL macro in the class implementation file.(在實現文件中使用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文件:
// 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;
}
}
如此之後,即可實現串行化類