0
如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
和IMPLEMENT_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它也可以使用序列號而不使用使用上述宏: