上一篇博客讲解过 protobuf 的序列化(将对象变成字节流的形式传出去)和反序列化(从字节流恢复成原来的对象),这篇博客将介绍另外一种序列化和反序列化的方案:Boost.Serialization。Boost.Serialization可以创建或重建程序中的等效结构,并保存为二进制数据、文本数据、XML或者有用户自定义的其他文件。
示例源码
protobuf 与 Boost.Serialization 的比较
protobuf:
轻量级的,支持的数据类型有限,且数据对象必须预先定义,使用 protoc 编译,但其效率较高,适合要求效率,允许自定义类型的内部场合使用。Boost.Serialization
Boost 库非常庞大,功能丰富,Boost.Serialization序列化只是其中的一个小分支,但就算只使用序列化,也需要安装整个Boost库,其支持的序列化功能强大,既支持二维数组(指针),也支持STL容器,序列化使用灵活简。
Boost.Serialization 的两种模式介绍
Boost序列化可以分为两种模式:侵入式(intrusive)和非侵入式 (non-intrusive)
侵入式(intrusive)
侵入式序列化时,需要在class里面加入序列化的代码,序列化的步骤大致如下:
- 先引用 boost 头文件
在类的声明中, 编写序列化函数,该函数的格式如下:
1
2
3
4
5template<class Archive>
void serialize(Archive & ar, const unsigned int version)//version是版本号
{
ar& m_str;
}类的实例化和赋值
- 定义一个序列化的对象和数据流的写入(具体序列化和反序列化的代码见示例源码)
1
2
3boost::archive::text_oarchive text_oa(text_sstream);//文本方式
boost::archive::binary_oarchive binary_oa(binary_sstream);//二进制方式
binary_oa << info;//将对象info的序列化数据以二进制存储形式写入内存
非侵入式(non-intrusive)
如果class是早已存在的,且我们不想再改变class里面的代码时,这个时候,我们可以使用非侵入式的序列化。非侵入式序列化时,序列化函数需要访问数据成员,这就要求将class的数据成员暴露出来,即public,而不是private。其序列化的步骤和上面的侵入式序列化步骤一致。
Boost 开发库的安装
$ sudo apt install libboost-dev libboost1.58-dev libboost-serialization1.58-dev