MFC 解密(4 )串行化

关键词:

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; }

你可能感兴趣的:(object,解密,table,Class,mfc,pascal)