Posted on 2012-03-08 19:06
eryar 閱讀(1709)
評論(0) 編輯 收藏 引用
Writing Serializable Classes
定義可序列化的類
盡管MFC的CFile類使文件的讀寫變得相當容易,但是通常MFC程序都不直接使用CFile對象。相反地,他們使用CArchive類來實現(xiàn)文件的讀寫,CArchive類最終還是通過CFile類來實現(xiàn)文件輸入/輸出。MFC得載了 << 和 >> 操作符來實現(xiàn)數(shù)據(jù)的進、出,主要是因為程序通常也是將數(shù)據(jù)存入或?qū)?shù)據(jù)取出。
Serialization是MFC中一個重要概念,因為他是MFC在文檔/視的程序中實現(xiàn)打開和保存文件的基礎(chǔ)。
定義可序列化的類
一個對象若要支持可序列化,它必須是可序列化類的實例。定義一個可序列化的類分為以下五步:
- 使該類直接或間接繼承類CObject;
- 在類聲明中包含MFC的宏DECLARE_SERIAL。DECLARE_SERIAL只要一個參數(shù):類名;
- 重載基類的Serialize函數(shù),并序列化繼承類的成員數(shù)據(jù);
- 若繼承類沒有默認構(gòu)造函數(shù),添加之。這步是必須的,因為當一個對象載入時,MFC使用默認構(gòu)造函數(shù)創(chuàng)建一個對象,并用文件中的數(shù)據(jù)來初始化對象的成員函數(shù);
- 在類的實現(xiàn)中包含MFC的宏IMPLEMENT_SERIAL。宏IMPLEMENT_SERIAL需要三個參數(shù):類名、基類名和模式號(schema number)。模式號是一個整數(shù),表示一個版本號。
實例
假設(shè)你定義了一個類CLine來表示直線,類有兩個CPoint的成員變量來存儲直線的端點,你想使這個類支持序列化。原始的類聲明如下:
1: class CLine
2: {
3: protected:
4: CPoint m_ptFrom;
5: CPoint m_ptTo;
6:
7: public:
8: CLine (CPoint from, CPoint to) { m_ptFrom = from; m_ptTo = to; }
9: };
使該類支持序列化很容易,如下代碼為添加序列化功能的類聲明:
1: class CLine : public CObject
2: {
3: DECLARE_SERIAL (CLine)
4:
5: protected:
6: CPoint m_ptFrom;
7: CPoint m_ptTo;
8:
9: public:
10: CLine () {} // Required!
11: CLine (CPoint from, CPoint to) { m_ptFrom = from; m_ptTo = to; }
12: void Serialize (CArchive& ar);
13: };
14:
重載的序列化函數(shù)如下所示:
void CLine::Serialize (CArchive& ar)
{
CObject::Serialize (ar);
if (ar.IsStoring ())
ar << m_ptFrom << m_ptTo;
else // Loading, not storing
ar >> m_ptFrom >> m_ptTo;
}
最后在類的實現(xiàn)文件中添加下面的宏即可:
1: IMPLEMENT_SERIAL (CLine, CObject, 1)
通過這些修改,這個類是完全支持可序列化的。