永续生存
参考文献:深入浅出MFC-侯捷
对象导向有一个术语:Persistence,有了此机制之后,对象就能永续保存。
MFC有一套Serialize机制,目的在于把档名的选择,文件的开关,缓冲区的建立,资料的读写,萃取运算子(>>)和嵌入运算子(<<)的多载,对象的动态生成包装起来。这些操作除了资料的读写和对象的动态生成(之前已经实现过),其余都是枝节。
文档的写过程,只要把其中的成员变量依次写进文件即可。我们首先应该记载其类别名称,然后才是对象中的资料。
读档有点麻烦,当程序从文件中读到一个类别名称,需要动态生成技术来生成一个对象。
1..DECLARE_SERIAL和IMPLEMENT_SERIAL宏
由此可以知道SERIAL宏是建立在动态生成的机制基础上的。
2.Serialble的必要条件
3.例子
要构建上图所示的资料结构,将这些资料进行存档。
首先介绍例子所用到的类的类别
3.1.Serialize过程:
3.2.大致的写档过程
3.3.详解Serialize写档奥秘:
3.3.1例子中文档所保存的具体资料如下:(我们关注的是程序怎么构造出这些数据)
3.3.2具体的写档过程如下:
//令file和archive产生关联,对着archive做序列化动作。CSribbleDoc要求线条串行COblist存储它自己。
//operator<<操作的作用:分为两部分,WriteClass(pClassRef)负责输出上文所要求的数据中的前面一部分,即区分是否为新类别的标记,类别的版本号码,类的名称大小及类的名称,至于后面的剩余数据由((Cobject*)pOb)->Serialize(*this)负责输出,将这些数据存储到序列化文件.SCB文件中。等到读档的过程需要用到SCB文件。
写档总结:程序组织数据,通过arr<<,arr.Write等操作将数据写到序列化文件.SCB文件中。
3.4.详解Serialize读档奥秘:
这边有DocTemplate负责产生Document,View,DocumentFrame三个对象(均为动态创建)
//令file和archive产生关联,对着archive做序列化动作
上图中的pOb为动态创建,获得当前所需类型的对象。
//返回所需Serialize的对象的CRuntimeClass,由此便可以动态创建所需要的Serialize对象
//由.SCB文件中读入类的名称,从而可以查找类别型录网来获得所需类的CruntimeClass数据结构。
读档总结:从.SCB文件中读取数据,读出类名,就可以通过一一比对类树开始进行动态生成,对该类进行Serialize操作。
总结:写档的过程是把各变量或者对象的数据全部写到序列化SCB文件中,将其保存到硬盘中;读档的时候就可以打开这个SCB文件,将数据读到各变量或者对象中。
Tip:程序员的工作:改写用户自定义对象中的Serialize函数即可。
没弄明白的问题:为啥IMPLEMENT_SERIAL需要重载>>操作,而不重载<<操作。书本中的解释是WriteObject操作不需要CRuntimeClass信息,但是ReadObject操作需要,因为在读完文件后还要做动态生成的动作。
疑惑:书中的代码详解有关于动态生成的具体过程应该是从SCB文件读取出所需要的类名,然后通过一一比对,获取所需要的CRuntimeClass信息,这样子来理解的话,ReadObject操作为啥还需要CRuntimeClass信息?