CFile:非緩衝二進位檔案,可自訂儲存方案,相容性與加密需自行處理。CStdioFile:封裝 C 執行期庫串流檔案,支援文字/二進位模式、緩衝操作。CArchive(配合 CFile):MFC 最常用的序列化引擎,支援基本類型、MFC 物件、集合類別的 << / >> 運算子與 Serialize 虛函數雙重機制。CObject(可間接繼承)。DECLARE_SERIAL(ClassName) 巨集。virtual void Serialize(CArchive& ar),內部呼叫基類 CObject::Serialize(ar)。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&)且需確保所有關鍵成員皆在拷貝/指派中正確處理,否則容器內物件會出現成員未初始化的錯誤。
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 序列化機制將複雜資料結構持久化封裝為標準化流程,配合集合類別與版本控制,極大簡化了檔案存取開發。掌握其核心規則與進階技巧,可構建健壯、可擴展的資料存儲層。