例如mfc,它应该添加
DECLARE_SERIAL(CGraph)
如果我有一节课,
class A
{
int a,b;
};
我可以将a和b的值存储到一个文件中,然后读取它。所以我不明白为什么DECLARE_SERIAL(CGraph)要用。
发布于 2013-06-22 09:02:55
只有您希望使用IMPLEMENT_SERIAL
提供的框架以多态方式序列化从CObject
派生的类,才需要MFC和MFC宏。
如果您的类不是从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的,所以不使用上面的宏也可以使用序列化:
https://stackoverflow.com/questions/17247019
复制