c++--对象串行化

对象的串行化

  • 串行化:将对象写入文件,使得在适当的时候对象能从文件中读出并恢复
  • 直接用write将对象内容输出、用read将对象恢复的问题
    1. 对象中存在指针时,指针所指对象内容不会被保存;
    2. 对象的成员本身可能是存在指针的对象;
    3. 对象不仅是数据的集合,还包括一系列行为,用read只能恢复数据,不能触发相应行为

串行化的基本方法

  • 手工串行化的基本方法
    1. 手工编写save和load函数
    2. 按照相同的顺序保存/恢复数据成员
    3. 碰到指针时,首先保存指针是否为空的标志,如非空,将指针对象的内容保存,load做相反操作
  • 完全手工编写串行化函数的困境
    1. save和load对成员的操作顺序完全相同,存在逻辑上的重复
    2. 处理指针等操作过于繁琐

理解Serialization

  • serialize函数
  1. serialize是模板,串行化和恢复都通过这一段源代码
  2. “&”被Serialization重载了,能够处理各种基本数据类型、标准库类型
  3. “&”碰到指针时,如果指针的目的类型也有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种串行化格式
  1. 普通文本:text_oachive/text_iachive
  2. 宽文本:text_woachive/text_wiachive
  3. 普通字符XML:xml_oachive/xml_iachive
  4. 宽字符XML:xml_woachive/xml_wiachive
  5. 二进制: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的其它功能

  • 可以进行版本控制
  • 全面支持对STL容器的串行化
  • 允许将serialize分开定义为两个不同的模板(save和load)
  • 进行“对象追踪”,如有两个指针指向同一对象,它能保证这个对象只被串行化一次,而且恢复时也只生成一个对象
    详细请查看:https://blog.csdn.net/Kiritow/article/details/53129096

猜你喜欢

转载自blog.csdn.net/qq_41498261/article/details/82960792
今日推荐