???

解决方案 »

  1.   

    用于支持序列化的宏推荐查看《深入浅出MFC》第三章上面有详细的描述
      

  2.   

    第3章 MFC 六大關鍵技術之模擬
    167
    DECLARE_SERIAL / IMPLEMENT_SERIAL 巨集要將 << 和 >> 兩個運算子多載化,還要讓 Serialize 函式神不知鬼不覺&#12702;放入類別宣告
    之&#12695;,最好的作法仍然是使用巨集。
    類別之能夠進行檔案讀寫動作,前提是擁有動態生成的能力,所以,MFC 設計了兩個巨
    集DECLARE_SERIAL 和 IMPLEMENT_SERIAL:
    #define DECLARE_SERIAL(class_name) \
    DECLARE_DYNCREATE(class_name) \
    friend CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb);
    #define IMPLEMENT_SERIAL(class_name, base_class_name, wSchema) \
    CObject* PASCAL class_name::CreateObject() \
    { return new class_name; } \
    _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, \
    class_name::CreateObject) \
    CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb) \
    { pOb = (class_name*) ar.ReadObject(RUNTIME_CLASS(class_name)); \
    return ar; } \
    為了在每&#12690;個物件被處理(讀或寫)之前,能夠處理瑣屑的工作,諸如判斷是否第&#12690;次
    出現、記錄版本號碼、記錄檔名等工作,CRuntimeClass 需要兩個函式 Load 和 Store:
    struct CRuntimeClass
    {
    // Attributes
    LPCSTR m_lpszClassName;
    int m_nObjectSize;
    UINT m_wSchema; // schema number of the loaded class
    CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class
    CRuntimeClass* m_pBaseClass;
    CObject* CreateObject();
    void Store(CArchive& ar) const;
    static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);
    // CRuntimeClass objects linked together in simple list
    static CRuntimeClass* pFirstClass; // start of class list
    CRuntimeClass* m_pNextClass; // linked list of registered classes
    };