在序列化对象时保存不住,DECLARE_SERIAL、IMPLEMENT_SERIAL、及Serialize方法都没错。问题出在哪呢?
宏IMPLEMENT_SERIAL(class_name, base_class_name, wSchema)第二个参数为父类名称,不注意它的写法,常常会用CObject。一般情况下不会出错,造成了这么写是正确写法的假象。
举个例子:
class CParent : public CObject
{
}
class CChild : public CParent
{
DECLARE_SERIAL(CChild);
public:
void Serialize(CArchive& ar);
...
}
IMPLEMENT_SERIAL(CChild, CObject, 0)
CChild::CChild()
{
}
void CChild::Serialize(CArchive& ar)
{
int rightcode = 1;
if(ar.IsStoring())
{
ar << rightcode;
}
else
{
ar >> rightcode;
}
__super::Serialize(ar);
}
修改后正常:
IMPLEMENT_SERIAL(CChild, CParent, 0)
原因呢,在IMPLEMENT_SERIAL过程中用到CRuntimeClass,而代码写的父类扰乱了程序解析,实际创建不出对象。明确父类后程序就可以正确创建对象。