您的位置:首页 > 其它

深入浅出MFC学习笔记:MFC六大关键技术仿真之永续生存

2013-06-02 19:34 288 查看

永续生存

MFC中很重要的一个模块:负责实现资料的读写过程,即数据该怎么去保存到硬盘中和从硬盘中取出来。
参考文献:深入浅出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为动态创建,获得当前所需类型的对象。








//返回所需Se
rialize的对象的CRuntimeClass,由此便可以动态创建所需要的Serialize对象






//由.SCB文件中读入类的名称,从而可以查找类别型录网来获得所需类的CruntimeClass数据结构。










读档总结:从.SCB文件中读取数据,读出类名,就可以通过一一比对类树开始进行动态生成,对该类进行Serialize操作。

总结:写档的过程是把各变量或者对象的数据全部写到序列化SCB文件中,将其保存到硬盘中;读档的时候就可以打开这个SCB文件,将数据读到各变量或者对象中。

Tip:程序员的工作:改写用户自定义对象中的Serialize函数即可。

没弄明白的问题:为啥IMPLEMENT_SERIAL需要重载>>操作,而不重载<<操作。书本中的解释是WriteObject操作不需要CRuntimeClass信息,但是ReadObject操作需要,因为在读完文件后还要做动态生成的动作。

疑惑:书中的代码详解有关于动态生成的具体过程应该是从SCB文件读取出所需要的类名,然后通过一一比对,获取所需要的CRuntimeClass信息,这样子来理解的话,ReadObject操作为啥还需要CRuntimeClass信息?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: