串行化(持久化):
实质:保存到文件及从文件中读出来
用面向对象的思想解决了数据的保存和读取
串行化的步骤:
1、读还是写,实例化两个文件对象
CFile file1("E://1.txt",//...);//reader
CFile file2(//...); //write
2、用CFile对象作为构造函数的参数,实例化CArchive对象:
CArchive ar(file1 或 file2);
然后调用文档的Serialize函数
CDoucment::Serialize(ar);
通过第二步,就转到了文档-视图框架的文档对象的Serialize函数内
3、在文档的Serialize函数内,读写(串行化)该文档管理的数据:
要区分数据类型:
3.1:内置类型
直接调用<<(存)或>>(读)
3.2:类类型
3.2.1:在对象指针上直接调用<<或>>,
技术要求:在类的定义和实现内添加“串行化宏”,同时添加Serialize函数
3.2.2:调用该对象的Serialize函数,技术要求:添加Serialize函数
注明:被串行化的对象的Serialize函数,负责串行化该对象的数据成员。
3.3数据类型
3.3.1:写的时候,便利整个数据集存储的对象,
将每个对象进行串行化(然后区分独享类型,重复做3.1、3.2、3.3的工作)
读的时候,一般是定义父类型指针(初始化为空),然后在该指针上进行串行化(>>)
3.3.2:直接调用数据集类的成员函数Serialize
注明:如果数据集类存储的是类对象,并且类对象有继承层次,
必须在每个类上添加“串行化宏”,Serialize函数可以选择性的继承
总说明:以上1、2两步工作是由文档-视图框架来自动完成的。如果是基于对话框的程序,
要实现串行化机制,1、2两步程序员自己实现
串行化的技术要求:
1、用户自定义的类必须从CObject派生
2、在类内覆盖Serialize函数(重载实现)
负责类内数据成员得保存和读取:
2.1、对于内置类型,直接调用CArchive的<<和>>运算符函数实现串行化
2.2、对于类类型对象,可以直接调用该对象的Serialize函数,也可以
调用CArchive的<<和>>对对象的调用
2.3、对于MFC数据基类(动态数组、链表词典)的串行化,直接调用该类
成员函数Serialize
3、必须和CArchive对象联合工作,实现对象的读和写
CArchive的功能:关联CFile对象,以进行硬盘的读写;调用被串行化的类对象的
Serialize函数
4、可以在类的定义文件内添加宏:DECLARE_SERIAL;在类的实现文件内
添加宏:IMPLEMENT_SERIAL。这样可以在串行化时,可以不调用对象的Serialize,
而是用<<和>>实现对象的读写。
5、如果不是基于文档-视图框架,必须构造CFile对象和CArchive对象,然后调用要串行化
的类对象的Serialize函数,才能实现文件读写