MFC 序列化提供物件層級的檔案 I/O 抽象,深度整合於 Doc/View 架構。本文系統解析 `CArchive`、`CObject::Serialize`、`DECLARE/IMPLEMENT_SERIAL` 巨集、動態建立機制,並以幾何圖形編輯器為例示範完整實作。
CFile file; CFileException fe;
if (!file.Open(path, CFile::modeRead, &fe)) { fe.ReportError(); return; }
CArchive ar(&file, CArchive::load);
ar >> obj1 >> obj2 >> obj3;
ar.Close(); file.Close();
CFile file; CFileException fe;
if (!file.Open(path, CFile::modeWrite|CFile::modeCreate, &fe)) { ... }
CArchive ar(&file, CArchive::store);
ar << obj1 << obj2 << obj3;
ar.Flush(); ar.Close(); file.Close();
CDocument::OnOpenDocument(path):
1. 建立 CFile (modeRead|shareDenyWrite)
2. DeleteContents() 清空現有資料
3. CArchive ar(file, load|bNoFlushOnDelete)
4. ar.m_pDocument = this; // 供序列化存取文檔指標
5. Serialize(ar) // 呼叫衍生類別實作
6. SetModifiedFlag(FALSE)
CDocument::OnSaveDocument(path):
1. 建立 CFile (modeCreate|modeReadWrite|shareExclusive)
2. CArchive ar(file, store|bNoFlushOnDelete)
3. Serialize(ar)
4. SetModifiedFlag(FALSE)
class CPicture : public CObject {
int m_nType;
DECLARE_SERIAL(CPicture)
public:
CPicture(int type = TYPE_UNKNOWN) : m_nType(type) {}
virtual void Draw(CDC* pDC) = 0;
void Serialize(CArchive& ar) {
if (ar.IsStoring()) ar << m_nType;
else ar >> m_nType;
}
};
IMPLEMENT_SERIAL(CPicture, CObject, VERSIONABLE_SCHEMA | 1)
class CPictureDoc : public CDocument {
CTypedPtrList m_listPictures;
// ...
void Serialize(CArchive& ar) {
if (ar.IsStoring()) {
POSITION pos = m_listPictures.GetHeadPosition();
while (pos) ar << m_listPictures.GetNext(pos);
} else {
RemoveAll();
CPicture* pPic;
while (true) {
try { ar >> pPic; m_listPictures.AddTail(pPic); }
catch (CException* e) { e->Delete(); break; }
}
}
}
};
class CLine : public CPicture {
CPoint m_ptStart, m_ptEnd;
DECLARE_SERIAL(CLine)
public:
void Serialize(CArchive& ar) {
CPicture::Serialize(ar); // 呼叫基類序列化
if (ar.IsStoring())
ar << m_ptStart.x << m_ptStart.y << m_ptEnd.x << m_ptEnd.y;
else
ar >> m_ptStart.x >> m_ptStart.y >> m_ptEnd.x >> m_ptEnd.y;
}
};
IMPLEMENT_SERIAL(CLine, CPicture, VERSIONABLE_SCHEMA | 2)
完整幾何圖形編輯器專案 (含矩形、三角形、橢圓等衍生類別) 已附於配套資源。