Writing Serializable Classes---定義可序列化的類
Posted on 2012-03-08 19:06 eryar 閱讀(1724) 評(píng)論(0) 編輯 收藏 引用
Writing Serializable Classes
定義可序列化的類
盡管MFC的CFile類使文件的讀寫(xiě)變得相當(dāng)容易,但是通常MFC程序都不直接使用CFile對(duì)象。相反地,他們使用CArchive類來(lái)實(shí)現(xiàn)文件的讀寫(xiě),CArchive類最終還是通過(guò)CFile類來(lái)實(shí)現(xiàn)文件輸入/輸出。MFC得載了 << 和 >> 操作符來(lái)實(shí)現(xiàn)數(shù)據(jù)的進(jìn)、出,主要是因?yàn)槌绦蛲ǔR彩菍?shù)據(jù)存入或?qū)?shù)據(jù)取出。
Serialization是MFC中一個(gè)重要概念,因?yàn)樗?strong>MFC在文檔/視的程序中實(shí)現(xiàn)打開(kāi)和保存文件的基礎(chǔ)。
定義可序列化的類
一個(gè)對(duì)象若要支持可序列化,它必須是可序列化類的實(shí)例。定義一個(gè)可序列化的類分為以下五步:
- 使該類直接或間接繼承類CObject;
- 在類聲明中包含MFC的宏DECLARE_SERIAL。DECLARE_SERIAL只要一個(gè)參數(shù):類名;
- 重載基類的Serialize函數(shù),并序列化繼承類的成員數(shù)據(jù);
- 若繼承類沒(méi)有默認(rèn)構(gòu)造函數(shù),添加之。這步是必須的,因?yàn)楫?dāng)一個(gè)對(duì)象載入時(shí),MFC使用默認(rèn)構(gòu)造函數(shù)創(chuàng)建一個(gè)對(duì)象,并用文件中的數(shù)據(jù)來(lái)初始化對(duì)象的成員函數(shù);
- 在類的實(shí)現(xiàn)中包含MFC的宏IMPLEMENT_SERIAL。宏IMPLEMENT_SERIAL需要三個(gè)參數(shù):類名、基類名和模式號(hào)(schema number)。模式號(hào)是一個(gè)整數(shù),表示一個(gè)版本號(hào)。
實(shí)例
假設(shè)你定義了一個(gè)類CLine來(lái)表示直線,類有兩個(gè)CPoint的成員變量來(lái)存儲(chǔ)直線的端點(diǎn),你想使這個(gè)類支持序列化。原始的類聲明如下:
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;
}
最后在類的實(shí)現(xiàn)文件中添加下面的宏即可:
1: IMPLEMENT_SERIAL (CLine, CObject, 1)
通過(guò)這些修改,這個(gè)類是完全支持可序列化的。