2013-06-22 22 views

回答

2

DECLARE_SERIALIMPLEMENT_SERIAL宏是隻爲您希望使用MFC提供的框架序列化多態CObject派生類的必要。

如果你的類不是從CObject衍生和/或你不希望使用MFC的序列多態(即通過指針CObject),那麼你當然可以實現自己的解決方案,你說不準。

例如,DECLARE_SERIAL(CMyClass)擴展到以下代碼進去類聲明

protected: 
    static CRuntimeClass* __stdcall _GetBaseClass(); 
public: 
    static CRuntimeClass classCMyClass; 
    static CRuntimeClass* __stdcall GetThisClass(); 
    virtual CRuntimeClass* GetRuntimeClass() const; 
    static CObject* __stdcall CreateObject(); 
    friend CArchive& __stdcall operator>>(CArchive& ar, CMyClass* &pOb); 

IMPLEMENT_SERIAL(CMyClass, CObject, VERSIONABLE_SCHEMA | 1)擴展到下面的代碼進去cpp文件

CObject* __stdcall CMyClass::CreateObject() 
{ 
    return new CMyClass; 
} 

extern AFX_CLASSINIT _init_CMyClass; 

CRuntimeClass* __stdcall CMyClass::_GetBaseClass() 
{ 
    return (CObject::GetThisClass()); 
} 

__declspec(selectany) CRuntimeClass CMyClass::classCMyClass = 
{ 
    "CMyClass", sizeof(class CMyClass), (0x80000000) | 1, 
    CMyClass::CreateObject, &CMyClass::_GetBaseClass, 0, &_init_CMyClass 
}; 

CRuntimeClass* __stdcall CMyClass::GetThisClass() 
{ 
    return ((CRuntimeClass*)(&CMyClass::classCMyClass)); 
} 

CRuntimeClass* CMyClass::GetRuntimeClass() const 
{ 
    return ((CRuntimeClass*)(&CMyClass::classCMyClass)); 
} 

AFX_CLASSINIT _init_CMyClass((CMyClass::GetThisClass())); 

CArchive& __stdcall operator>>(CArchive& ar, CMyClass* &pOb) 
{ 
    pOb = (CMyClass*) ar.ReadObject((CMyClass::GetThisClass())); 
    return ar; 
} 

因爲它says in MSDN它也可以使用序列號而不使用使用上述宏:

MSDN

相關問題