首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ MFC 序列化機制全解析:從可序列化類設計到複雜資料結構持久化

     編輯:VC 教學

MFC 三大檔案處理類別

  • CFile:非緩衝二進位檔案,可自訂儲存方案,相容性與加密需自行處理。
  • CStdioFile:封裝 C 執行期庫串流檔案,支援文字/二進位模式、緩衝操作。
  • CArchive(配合 CFile):MFC 最常用的序列化引擎,支援基本類型、MFC 物件、集合類別的 << / >> 運算子與 Serialize 虛函數雙重機制。

實作可序列化類別的五大鐵律

  1. 繼承自 CObject(可間接繼承)。
  2. 類別宣告中使用 DECLARE_SERIAL(ClassName) 巨集。
  3. 提供**預設建構函數**(反序列化時由框架調用)。
  4. 覆寫 virtual void Serialize(CArchive& ar),內部呼叫基類 CObject::Serialize(ar)。
  5. 實作檔中使用 IMPLEMENT_SERIAL(ClassName, BaseClass, Version) 指定版本號。

實戰範例:鏈結圖資料結構序列化

class CMapVertex : public CObject {
    DECLARE_SERIAL(CMapVertex)
public:
    CMapVertex();                    // 預設建構函數
    void Serialize(CArchive& ar);
    CMap m_pre; // 鄰接權重表
    CMapVertex* next;                // 鏈結指標
};
IMPLEMENT_SERIAL(CMapVertex, CObject, 0)

void CMapVertex::Serialize(CArchive& ar) {
    if (ar.IsStoring()) {
        // 存儲其他資料...
    } else {
        // 讀取其他資料...
    }
    m_pre.Serialize(ar);      // MFC 集合類別已內建序列化支援
    CObject::Serialize(ar);   // 呼叫基類序列化
}

// 管理頂點鏈結的容器類別
class CMyMap : public CObject {
    DECLARE_SERIAL(CMyMap)
public:
    CMapVertex* m_TopVertex;
    UINT m_VertexNum;
    CMyMap();
    void Serialize(CArchive& ar);
};
IMPLEMENT_SERIAL(CMyMap, CObject, 0)

void CMyMap::Serialize(CArchive& ar) {
    CMapVertex* temp = m_TopVertex;
    if (ar.IsStoring()) {
        ar << m_VertexNum;          // 先寫入節點總數
        for (UINT i = 0; i < m_VertexNum; i++) {
            temp->Serialize(ar);    // 遞迴序列化每個節點
            temp = temp->next;
        }
    } else {
        ar >> m_VertexNum;
        if (m_VertexNum != 0) {
            temp = m_TopVertex = new CMapVertex; // 堆積配置,解構時釋放
            m_TopVertex->Serialize(ar);
        }
        for (UINT i = 1; i < m_VertexNum; i++) {
            temp->next = new CMapVertex;
            temp = temp->next;
            temp->Serialize(ar);
        }
    }
    CObject::Serialize(ar);
}

進階細節與避坑指南

集合類別中使用自訂類型

若要將自訂類別用於 CList、CArray、CMap 等樣板集合,除上述五條規則外,還**必須**實作:

  • 拷貝建構函數 CMapVertex(const CMapVertex&)
  • 指派運算子重載 CMapVertex& operator=(const CMapVertex&)

且需確保所有關鍵成員皆在拷貝/指派中正確處理,否則容器內物件會出現成員未初始化的錯誤。

CArchive 支援的資料類型

BYTE, WORD, DWORD, int, LONG, float, double, CString, CObject*, CPoint, CSize, CTime, CRect, COleCurrency, COleDateTime... 等。
注意:bool 不在支援清單,需強制轉型為 BYTE 讀寫;BOOL 視同 BYTE 可直接操作。

指標與物件序列化的選擇

  • 靜態物件或已配置記憶體的指標 → 呼叫 Serialize(ar)。
  • 未配置記憶體的指標 → 使用 ar << pObj / ar >> pObj(框架自動配置/釋放)。

總結

MFC 序列化機制將複雜資料結構持久化封裝為標準化流程,配合集合類別與版本控制,極大簡化了檔案存取開發。掌握其核心規則與進階技巧,可構建健壯、可擴展的資料存儲層。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved