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

VC++ 不使用 Document/View 架構也能序列化儲存資料:CObject 衍生類別實作指南

     編輯:VC 教學

前言:Document/View 不萬能

MFC 預設 CDocument::Serialize 綁定檔案儲存,但某些資料(設定檔、黑名單、快取)不需顯示於 View、不想讓用戶干預,硬塞進 Document 反而混亂架構。本文示範獨立衍生 CObject 類別實作序列化,完全脫離 Document/View。

核心類別設計

// SerData.h
class CSerData : public CObject
{
    DECLARE_SERIAL(CSerData)  // 必須!啟用動態建立與序列化

public:
    CSerData();
    virtual ~CSerData();
    virtual void Serialize(CArchive& ar);  // 覆寫序列化

    // 資料成員
    int m_nID;
    CString m_strName;
    BOOL m_bIsSave;

    // 操作介面
    BOOL SaveData();
    BOOL LoadData();
};

序列化實作

// SerData.cpp
IMPLEMENT_SERIAL(CSerData, CObject, 1)  // 版本號 1

void CSerData::Serialize(CArchive& ar)
{
    if (ar.IsLoading()) {
        ar >> m_strName;
        ar >> m_nID;
    } else {
        ar << m_strName;
        ar << m_nID;
    }
}

檔案儲存與讀取封裝

#define DATA_FILE _T("DataTest.dat")

BOOL CSerData::SaveData()
{
    UINT nFlags = CFile::modeCreate | CFile::modeWrite | CFile::typeBinary;
    CFile file;
    CFileException fe;

    if (!file.Open(DATA_FILE, nFlags, &fe))
        return FALSE;

    CArchive ar(&file, CArchive::store);
    Serialize(ar);  // 呼叫虛函數實作
    ar.Close();
    file.Close();
    return TRUE;
}

BOOL CSerData::LoadData()
{
    CFile file;
    CFileException fe;

    if (!file.Open(DATA_FILE, CFile::modeRead | CFile::typeBinary, &fe))
        return FALSE;

    CArchive ar(&file, CArchive::load);
    Serialize(ar);
    ar.Close();
    file.Close();
    return TRUE;
}

在對話框/視圖中使用

// 對話框成員
CSerData m_Data;

void CMyDialog::OnSave()
{
    UpdateData(TRUE);  // 從控件取得資料
    m_Data.m_nID = m_nID;
    m_Data.m_strName = m_strName;
    if (m_Data.SaveData())
        AfxMessageBox(_T("儲存成功"));
    else
        AfxMessageBox(_T("儲存失敗"));
}

void CMyDialog::OnLoad()
{
    if (m_Data.LoadData()) {
        m_nID = m_Data.m_nID;
        m_strName = m_Data.m_strName;
        UpdateData(FALSE);  // 更新控件顯示
        AfxMessageBox(_T("讀取成功"));
    } else {
        AfxMessageBox(_T("讀取失敗或檔案不存在"));
    }
}

關鍵點總結

要點說明
衍生 CObject序列化機制建立在 CObject 基礎上
DECLARE_SERIAL / IMPLEMENT_SERIAL啟用動態建立、版本控制、Schema 號
CArchive 配合 CFileStore/Load 模式對應寫入/讀取
版本號管理IMPLEMENT_SERIAL 最後一參數為版本,舊版資料可相容讀取
錯誤處理CFileException 捕捉檔案 IO 錯誤

進階延伸

  • 複雜資料結構:CArray/CList/CMap 等 MFC 容器支援序列化,成員為 CObject 衍生類別時自動遞迴。
  • 版本相容:Serialize 內用 ar.GetObjectSchema() 判斷版本,條件式讀寫。
  • 加密儲存:CFile 衍生類別實作加密/解密,CArchive 無感知差異。

結語

不綁定 Document/View 照樣能用 MFC 強大的序列化機制。將資料邏輯封裝在獨立 CObject 衍生類別,乾淨、可重用、符合單一職責原則。下次需要「只存不顯」的資料時,請直接新增一個 CSerData 類別。

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