以下内容为大学期间学习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——在函数中返回数组的常用方法
文章目录
一、对象的串行化
- 串行化:将对象写入文件,使得在适当的时候对象能从文件中读出并恢复
- 直接用write将对象内容输出、用read将对象恢复的问题
- 对象中存在指针时,指针所指对象内容不会被保存;
- 对象的成员本身可能是存在指针的对象;
- 对象不仅是数据的集合,还包括一系列行为,用read只能恢复数据,不能触发相应行为
1.1 串行化的基本方法
- 手工串行化的基本方法
- 手工编写save和load函数
- 按照相同的顺序保存/恢复数据成员
- 碰到指针时,首先保存指针是否为空的标志,如非空,将指针对象的内容保存,load做相反操作
- 完全手工编写串行化函数的困境
- save和load对成员的操作顺序完全相同,存在逻辑上的重复
- 处理指针等操作过于繁琐
1.2 理解Serialization
- serialize函数
- serialize是模板,串行化和恢复都通过这一段源代码
- “&”被Serialization重载了,能够处理各种基本数据类型、标准库类型
- “&”碰到指针时,如果指针的目的类型也有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种串行化格式
- 普通文本:text_oachive/text_iachive
- 宽文本:text_woachive/text_wiachive
- 普通字符XML:xml_oachive/xml_iachive
- 宽字符XML:xml_woachive/xml_wiachive
- 二进制: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