为什么可序列化类必须具有从类名获取实例的函数?

时间:2013-06-22 03:17:22

标签: serialization mfc

如mfc,应添加

DECLARE_SERIAL(CGraph)

如果我有课,

class A
{
    int a,b;
};

我可以将a和b的值存储到文件中,然后读取它。 所以我无法理解为什么使用DECLARE_SERIAL(CGraph)。

1 个答案:

答案 0 :(得分: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