您的位置:首页 > 其它

MFC 解密(4 )串行化

2010-08-18 14:01 134 查看
关键词:

Serialize(CArchive& ar);

DECLARE_SERIAL

IMPLEMENT_SERIAL

1. 当用户选择打开或者保存文件的时候,系统会调用CDocument::OnSaveDucument(),在这个函数里,首先生成一个 CArchive对象,然后调用Serialize(),由于Serialize()是CObject的虚函数,所以自己的派生类MyDoc::Serialize()会得到调用。

2. 在CMyDoc中,需要序列化的变量必须派生自CObject,在CMyDoc::Serialize中

void CMyDocDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
ar << &m_data;
}
else
{
// TODO: add loading code here
//ar >> &m_data;
}
}


3. ar<<&m_data实际调用的是CArchive::WriteObject(),在这个函数中调用了m_data这个对象对应的类的Serialize(),然后这个类处理自己需要Serialize的变量。 所以说要串行化的对象必须派生自CObject 否则Serialize不会被调用

// write class of object first
CRuntimeClass* pClassRef = pOb->GetRuntimeClass();
WriteClass(pClassRef);

// enter in stored object table, checking for overflow
CheckCount();
(*m_pStoreMap)[(void*)pOb] = (void*)(DWORD_PTR)m_nMapCount++;

// cause the object to serialize itself
((CObject*)pOb)->Serialize(*this);


5步:

1. 需要保存的对象对应的类必须从CObject派生

2. 该类重写Serialize(),串行化该类要串行化的成员

3. DECLARE_SERIAL

4. IMPLEMENT_SERIAL

5. 定义一个不带参数的构造函数

IMPLEMENT_SERIAL解密

#define IMPLEMENT_SERIAL(class_name, base_class_name, wSchema) /
CObject* PASCAL class_name::CreateObject() /
{ return new class_name; } /
extern AFX_CLASSINIT _init_##class_name; /
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, /
class_name::CreateObject, &_init_##class_name) /
AFX_CLASSINIT _init_##class_name(RUNTIME_CLASS(class_name)); /
CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb) /
{ pOb = (class_name*) ar.ReadObject(RUNTIME_CLASS(class_name)); /
return ar; }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: