加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[转载]MFC文档序列化

(2014-04-16 16:19:23)
标签:

转载

分类: 程序员
原文地址:MFC文档序列化作者:风铭

文档序列化过程

假设有文档CScribbleDoc,代表一组线,每条线由一个线宽和一组点来描述。如下图:

http://s5/middle/7ce2cb41xbb5d40401fa4&690

序列化的过程为:

http://s1/middle/7ce2cb41xbb5d4193dda0&690

 

序列化过程的实现代码:

http://s6/middle/7ce2cb41xbb5d41205ca5&690

序列化完成后,对象被存入到文件里:如图:

http://s11/middle/7ce2cb41xbb6ba52d707a&690

 

每个段的含义:

http://s11/middle/7ce2cb41xbb843558f43a&690


可见,对象序列化,除了要记录对象的数据外,还要记录对象的类型,如果是集合对象,还要记录对象个数。恢复对象时,首先根据对象类型创建对象,然后调用对象的序列化方法恢复对象。

 

 

下面说明这个文件的数据如何产生(写文件):

从File-save as开始

http://s7/middle/7ce2cb41xbb6c319b4a66&690

http://s16/middle/7ce2cb41xbb6c31a7ab0f&690

http://s12/middle/7ce2cb41xbb6c31aa9afb&690

http://s14/middle/7ce2cb41xbb6c31b93c4d&690

对于含有简单类型,类类型和集合类型的复杂对象如何序列化(即如何写serialize方法),下面是我的猜想,待验证:

  • 对简单类型对象,应该用ar << object的方法做序列化。
  • 对于自定义类类型对象,应该用ar << object的方法做序列化,并重写类类型的serialize方法。因为CArchive的<<重载实现里要调用object的serialize方法。例如: ar<<object
  • 对集合对象,应该调用它的serialize方法完成序列化,因为集合对象的类已经定义好了该方法。例如:
    m_strokeList->serialize(ar); 

 

 如何恢复已经序列化的对象:(读文件)

http://s15/middle/7ce2cb41x7926cc21762e&690
http://s10/middle/7ce2cb41x7926cdf29759&690
http://s7/middle/7ce2cb41xbb840fc00776&690
http://s11/middle/7ce2cb41xbb8413bdce9a&690
http://s2/middle/7ce2cb41xbb84170ed151&690
http://s2/middle/7ce2cb41xbb841a5c08c1&690
http://s16/middle/7ce2cb41xbb841cec0e7f&690
http://s3/middle/7ce2cb41x7926d00e8e12&690
http://s11/middle/7ce2cb41xbb8423e8524a&690


 

Serializable的必要条件
    欲让一个对象有Serialize能力,它必须派生自一个Serializable类。一个类意欲成为Serializable,必须有下列五大条件:
      1.从CObject派生下来。如此一来可保有RTTI, Dynamic Creation等机能。
      2.类的声明部分必须有DECLARE_SERIAL宏。此宏需要一个参数:类名称。
      3.类的实现部分必须有IMPLEMENT SERIAL宏。此宏需要三个参数:一是类名称,二是基类名称,三是schema no. 
      4.改写Serializ。虚函数,使它能够适当地把类的成员变量写入文件中。
      5.为此类加上一个default构造函数(也就是无参数之构造函数)。这个条件常为人所忽略,但它是必要的,因为若一个对象来自文件,MFC必须先动态创建它,而且在没有任何参数的情况下调用其构造函数,然后才从文件中读出对象数据。
http://s16/middle/7ce2cb41x7926d5a00ecf&690
http://s12/middle/7ce2cb41xbb849637ceeb&690

0

  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有