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

對話框型應用程式實現序列化讀寫:手動調用 Serialize 突破 Doc/View 限制

     編輯:VC 教學

背景

MFC 序列化機制 (CArchive + Serialize) 預設僅在 Doc/View 架構下自動觸發。對話框專案若想復用此機制,需自行管理檔案開啟/關閉並顯式呼叫 Serialize。

實作範例:日記應用

應用程式類別 CMyDiaryApp 重寫 Serialize

void CMyDiaryApp::Serialize(CArchive& ar) {
    WORD nCount;
    if(ar.IsStoring()) {
        nCount = (WORD)m_diaryList.GetCount();
        ar << nCount;
        POSITION pos = m_diaryList.GetHeadPosition();
        while(pos) {
            CDiary* p = m_diaryList.GetNext(pos);
            ar << p->m_date; // 假設 CDiary 只序列化日期示範
        }
        ASSERT(nCount == 0);
    } else {
        ar >> nCount;
        while(nCount--) {
            CDiary* p = new CDiary;
            ar >> p->m_date;
            m_diaryList.AddTail(p);
        }
    }
}

提供公開介面供 UI 呼叫

void CMyDiaryApp::OnRead() {
    CFile file;
    if(file.Open(_T("diary.dat"), CFile::modeRead)) {
        CArchive ar(&file, CArchive::load);
        Serialize(ar); // 關鍵:手動調用
        ar.Close(); file.Close();
    }
}
void CMyDiaryApp::OnSave() {
    CFile file;
    if(file.Open(_T("diary.dat"), CFile::modeCreate|CFile::modeWrite)) {
        CArchive ar(&file, CArchive::store);
        Serialize(ar);
        ar.Close(); file.Close();
    }
}

UI 端綁定 (如選單「開啟/儲存」或按鈕)

void CMyDialog::OnBtnLoad() { ((CMyDiaryApp*)AfxGetApp())->OnRead(); RefreshList(); }
void CMyDialog::OnBtnSave() { ((CMyDiaryApp*)AfxGetApp())->OnSave(); }

關鍵優勢

  • 統一資料持久化邏輯在 Serialize,避免讀/寫代碼重複
  • 支援版本控制 (ar.GetObjectSchema()) 與多態序列化 (RUNTIME_CLASS)
  • 可無縫遷移至 Doc/View 架構 (只需移除手動呼叫)

注意事項

  • CFile::modeCreate|modeWrite 會截斷既有檔案,確認無誤再存
  • 大量資料考慮分塊或改用資料庫
  • 異常處理:CFileException、CArchiveException 需捕獲
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved