[转载]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的必要条件
http://s16/middle/7ce2cb41x7926d5a00ecf&690
http://s12/middle/7ce2cb41xbb849637ceeb&690