使用 MFC 串行化數據和 C++ 對象(二)

串行化處理

  我們要串行化 CPhone 對象,把C++對象寫入文件,所以需要在 CPhone 類的定義和實現文件中加入相應的串行化代碼,首先要在 CPhone 頭文件中加入一個 MFC 宏,這是串行化需要的宏,必須爲它提供一個參數,也就是類的名字。

// 串行化宏定義
DECLARE_SERIAL(CPhone)

  其次是聲明串行化函數,這個原型是必須的,因爲要串行化類 CPhone 對象列表,所以 CPhone 類必須有一個屬於自己的 Serialize()函數:

// 串行化函數 Serialize() 
virtual void Serialize(CArchive& ar);

  在 CPhone 實現文件中也要加入對應的代碼,這個宏也是串行化需要的另一個宏,它有三個參數,第一個是類名,第二個是基類名,第三個是應用程序的版本號,可以將版本號定義爲任何值,當串行化數據到文件時,此版本號也要寫入文件。

// 串行化宏實現
IMPLEMENT_SERIAL(CPhone,CObject,0);

  串行化函數 Serialize() 實現

if (ar.IsStoring())
{

 ar << m_Name << m_Phone;
}
else
{

 ar >> m_Name >> m_Phone;
}

  這裏要注意的是爲了使用 CObList 類的成員函數 Serialize(),有幾個前提條件需要滿足:

  列表類對象必須是 MFC CObject 類的派生類對象,也就是說 CPhone 類必須是 CObject 的派生類;

  在列表中的對象類必須具備一個不帶參數的構造函數。如果需要,也可以有其它帶參數的構造函數;

  必須聲明和實現列表類的串行化函數 Serialize(),即 CPhone::Serialize();

  實現列表對象的串行化必須使用 DECLARE_SERIAL/IMPLEMENT_SERIAL 宏;

調用列表 Serialize()函數

  這一步是串行化列表 m_PhoneList,也就是調用 m_PhoneList 的成員函數 Serialize()。在什麼地方調用呢?記住,無論用戶什麼時候從“File”菜單中選擇“Save”或者“Save as”或“Open”選項,都將執行文檔類的 Serialize()函數,所以必須在文檔類的 Serialize()函數中調用 m_PhoneList 的 Serialize()函數。

  這樣一來,無論用戶什麼時候從 File 菜單中選擇 Save/Save as 時,都將把 m_PhoneList 保存在用戶選擇的文件中,同樣地,無論用戶什麼時候從選擇 Open 時,都將把文件中保存的列表信息加載到 m_PhoneList 中來。m_PhoneList 的串行化調用如下:

m_PhoneList.Serialize(ar);

  只要在文檔類的 Serialize() 函數中調用上面這條語句時,必須把 ar 作爲參數傳入,它將完成需要串行化 m_PhoneList 列表數據的所有工作。不必在if語句中再做其它處理。

定製串行化

  ——例子程序:ARCH

  串行化處理有時並不需要用戶選擇文件,此時仍要從或向一個特定文件串行化數據,本部分將描述怎樣創建並定製一個 CArchive 對象。創建一個新的單文檔 SDI 應用, 工程名爲 ARCH。視圖類仍然選擇 CFormView。視圖中兩個編輯框和兩個按鈕,編輯框用於輸入數據,“Save to File”按鈕用於將輸入的數據串行化到文件,“Load from File”按鈕用於從文件中抽取數據。爲簡單起見,文件使用的硬編碼。

  下面是 “Save to File”的操作代碼:


// 用屏幕輸入內容更新 m_Var1 和 m_Var2 

UpdateData(TRUE);


// 創建文件 C:ARC.ARC

CFile f;

f.Open("c:\arc.arc",CFile::modeCreate|CFile::modeWrite);


// 創建一個 CArchive 對象,並將文件與對象關聯

CArchive ar(&f,CArchive::store);


// 串行化 m_Var1 和 m_Var2 到文檔

ar<<m_Var1<<m_Var2;


// 關閉文檔

ar.Close();


// 關閉文件

f.Close();

  下面是 “Load from File”的操作代碼:


// 打開文件 C:ARC.ARC

CFile f;

if ( f.Open("c:\arc.arc",CFile::modeRead == FALSE )

return;


// 創建一個 CArchive 對象,並將文件與對象關聯

CArchive ar(&f,CArchive::load);


// 從對象中抽取數據並賦值給成員變量

ar>>m_Var1>>m_Var2;


// 關閉文檔

ar.Close();


// 關閉文件

f.Close();


// 更新屏幕顯示

UpdateData(FALSE);

  以上是三個 MFC 串行化數據的例子,Memo 程序的功能是串行化數據到文件,Phn 程序是串行化 C++ 對象列表到文件,而 ARCH 則是定製串行化。


發佈了3 篇原創文章 · 獲贊 29 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章