比如mfc,应该加上
DECLARE_SERIAL(CGraph)
如果我有课,
class A
{
int a,b;
};
我可以将 a 和 b 的值存储到一个文件中,然后读取它。所以我不明白为什么使用 DECLARE_SERIAL(CGraph) 。
比如mfc,应该加上
DECLARE_SERIAL(CGraph)
如果我有课,
class A
{
int a,b;
};
我可以将 a 和 b 的值存储到一个文件中,然后读取它。所以我不明白为什么使用 DECLARE_SERIAL(CGraph) 。
DECLARE_SERIAL
和宏仅对于您希望使用 MFC 提供的框架进行多态IMPLEMENT_SERIAL
序列化的类派生是必需的。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;
}
正如它在 MSDN 中所说,也可以在不使用上述宏的情况下使用序列化: