MFC序列化 (三)

2014-11-24 03:07:17 · 作者: · 浏览: 5
CStudent*)ar.ReadObject(RUNTIME_CLASS(CStudent));
return ar;
}
CObject* PASCAL CStudent::CreateObject()
{
return new CStudent;
}
_IMPLEMENT_RUNTIMECLASS(CStudent,CObject,1,CStudent::CreateObject);
AFX_CLASSINIT _init_CStudent(RUNTIME_CLASS(CStudent));
void ObjStore(CStudent&stu)
{
CFile file;
file.Open(L"c:\\student.data",CFile::modeCreate|CFile::modeWrite);
CArchive ar(&file,CArchive::store);
ar<<&stu;
ar.Close();
file.Close();
}
void ObjLoad()
{
CFile file;
file.Open(L"c:\\student.data",CFile::modeRead);
CArchive ar(&file,CArchive::load);
CStudent *pStu=NULL;
ar>>pStu;
ar.Close();
if (pStu)
{
pStu->Show();
}
}
void main()
{
CStudent stu(L"ZhangShan",18);
ObjStore(stu);//对象的序列化
ObjLoad();//对象的反序列化
}
/*
class CStudent

...
_DECLARE_DYNCREATE(CStudent)//动态创建宏
AFX_API friend CArchive& AFXAPI operator>>(CArchive& ar,CStudent* &pOb);

1.operator>>-创建类的对象并读取数据
2._init_CStudent-变量展开后是一个函数AfxClassInit,将CStudent的运行时类信息保存到程序的模块中m_classList
3.序列化的过程
1> 获取对象的运行时类信息: CRuntimeClass* pClassRef = pOb->GetRuntimeClass();
2> 将类的版本和名称写入到Archive对象中WriteClass(pClassRef);调用 pClassRef->Store(*this);,在函数中,将类的版本、大小、名称保存到Archive对象
3> 调用对象的Serialize函数((CObject*)pOb)->Serialize(*this);
4> 在Serialize函数中,将对象的数据保存到Archive对象中 ar<


4.反序列化的过程
1> _init_CStudent变量将类的运行时类信息保存到应用程序中。
2> 从文件中读取类的名称和版本ReadClass函数,调用pClassRef = CRuntimeClass::Load(*this, &nSchema)在函数中,从Archive对象读取类的版本、大小 和名称。
3> 使用从文件中读取的类的名称,在程序的链表m_classList中,去查找类的运行时信息
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
for (pClass = pModuleState->m_classList; pClass != NULL;pClass = pClass->m_pNextClass)
{
if (lstrcmpA(szClassName, pClass->m_lpszClassName) == 0)
{
AfxUnlockGlobals(CRIT_RUNTIMECLASSLIST);
return pClass;
}
}
4> ReadClass函数执行完毕后,调用CreateObject函数 pOb = pClassRef->CreateObject();调用宏展开后的函数,创建CStudent类的对象
5> 调用对象的Serialize函数 pOb->Serialize(*this);
6> 在Serialize函数中,读取对象的数据 ar>>m_strName>>m_nAge;

*/运行结果:

\