MFC对象序列化

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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值