一、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"// GraphIMPLEMENT_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;}}