MFC应用程序在执行保存(OnFileSave())或打开(OnFileOpen())命令的时候,会在这个函数当中调用文档对象的序列化函数Serialize(),这是一个从CObject当中继承下来的方法,要在Doc当中声明
virtual void Serialize(CArchive& ar);
实现这个方法时,可以用"<<"和">>"作输入和输出的符号,如
void CFileDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())//如果ar正在存储
{
// TODO: 在此添加存储代码
ar<<"要输出的数据";
}
else
{
// TODO: 在此添加加载代码
ar>>"要加载的数据";
}
OtherObject.Serialize(ar);//调用其他对象的序列化函数,实现级联序列化
}
当序列化实现后,函数会从初始对象一层层调用其对象成员的序列化函数,直到所有变成基本类型.
存储的顺序和加载的顺序相同,都是从高层到低层.
对于"打开"命令,函数执行顺序如下:
CArchive loadArchive(pFile,CArchive::load}CArchive::bNoFlushOnDelete);
loadArchive.m_pDocument=this;//使CArchive 对象文档对象指针指向当前文档
Serialize(loadArchive);//调用当前文档对象的序列化函数序列化输入CArchive指向的文件到内存当中
loadArchive.Close();
ReleaseFile(pFile,FALSE);//释放文件对象
对于嵌套对象,要从外向内调用各对象序列化函数,写入顺序与读取顺序相同
对于要序列化的对象,可以像JAVA那样在类定义当中声明序列化:
class XXXX
{
DECLARE_SERIAL(XXXX);
..........
public:
virtual void Serialize(CArchive& ar);
}
并且在类实现当中声明:
IMPLEMENT_SERIAL(class_name,base_class,UINT版本号);
声明的作用是重载">>"和对对象动态创建声明宏(DECLARE_DYNCREATE(class_name))