对象的串行化
- 串行化:将对象写入文件,使得在适当的时候对象能从文件中读出并恢复
- 直接用write将对象内容输出、用read将对象恢复的问题
- 对象中存在指针时,指针所指对象内容不会被保存;
- 对象的成员本身可能是存在指针的对象;
- 对象不仅是数据的集合,还包括一系列行为,用read只能恢复数据,不能触发相应行为
串行化的基本方法
- 手工串行化的基本方法
- 手工编写save和load函数
- 按照相同的顺序保存/恢复数据成员
- 碰到指针时,首先保存指针是否为空的标志,如非空,将指针对象的内容保存,load做相反操作
- 完全手工编写串行化函数的困境
- save和load对成员的操作顺序完全相同,存在逻辑上的重复
- 处理指针等操作过于繁琐
理解Serialization
- serialize是模板,串行化和恢复都通过这一段源代码
- “&”被Serialization重载了,能够处理各种基本数据类型、标准库类型
- “&”碰到指针时,如果指针的目的类型也有serialize成员函数,则用该函数将指针内容串行化/恢复
boost::serialization
- 用Serialization库将下列结构体串行化:
struct SalaryInfo {
string name;
double salary;
TaxInfo *tax;
};
- 只需增加一个成员函数模板(需要TaxInfo也实现了同样的成员函数模板):
template <class Archive>
void SalaryInfo::serialize(Archive & ar,unsigned int version) {
ar & name & salary & tax;
}
Serialization的文档类
- 文档类: 用于实际执行串行化操作
- 支持5种串行化格式
- 普通文本:text_oachive/text_iachive
- 宽文本:text_woachive/text_wiachive
- 普通字符XML:xml_oachive/xml_iachive
- 宽字符XML:xml_woachive/xml_wiachive
- 二进制:binary_oachive/binary_iachive
文档类的使用
ofstream ofs("salary.txt", ios_base::out);
text_oarchive oa(ofs);
oa << s1;
ifstream ifs("salary.txt", ios_base::in);
text_iarchive ia(ifs);
SalaryInfo s2;
ia >> s2;
Serialization的其它功能