《C++》基础入门_17——对象串行化

以下内容为大学期间学习C++语言总结的知识:

《C++》基础入门_01——数据存储,表示形式,基本运算
《C++》基础入门_02——面向对象的总体概括
《C++》基础入门_03——程序的开发过程
《C++》基础入门_04——四大语句
《C++》基础入门_05——函数详解篇
《C++》基础入门_06——面向对象的详述
《C++》基础入门_07——数据的共享保护:const
《C++》基础入门_08——利用数组实现对批量数据的处理
《C++》基础入门_09——指针和引用的讲解
《C++》基础入门_10——用户自定义数据类型详细篇
《C++》基础入门_11——友元的讲解
《C++》基础入门_12——类模板
《C++》基础入门_13——运算符的重载
《C++》基础入门_14——继承与派生
《C++》基础入门_15——多态性
《C++》基础入门_16——输入输出流详讲
《C++》基础入门_17——对象串行化
《C++》基础入门_18——异常处理
《C++》基础入门_19——命名空间
《C++》基础入门_20——文件操作
《C++》基础入门_21——在函数中返回数组的常用方法


文章目录

    • 一、对象的串行化
      • 1.1 串行化的基本方法
      • 1.2 理解Serialization
      • 1.3 boost::serialization
      • 1.4 Serialization的文档类
      • 1.5 文档类的使用
      • 1.6 Serialization的其它功能


一、对象的串行化

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

1.1 串行化的基本方法

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

1.2 理解Serialization

  • serialize函数
  1. serialize是模板,串行化和恢复都通过这一段源代码
  2. “&”被Serialization重载了,能够处理各种基本数据类型、标准库类型
  3. “&”碰到指针时,如果指针的目的类型也有serialize成员函数,则用该函数将指针内容串行化/恢复

1.3 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;
    }
    

1.4 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

1.5 文档类的使用

  • 保存对象:用“<<”

    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;
    

1.6 Serialization的其它功能

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

详细请查看:https://blog.csdn.net/Kiritow/article/details/53129096

你可能感兴趣的:(C++,#,c++基础语法,serialization,序列化)