序列化操作简介
序列化是将程序数据保存到磁盘中比较方便的一种方式,简单理解序列化就是将程序中的数据统一转化成字符串最终保存在磁盘中或进行网络传输,同时可通过反序列化过程恢复程序数据,是数据储存和数据传输的利器。有很多第三方库可以做序列化,boost库的序列化的功能是我比较常用的一种序列化方法,下文将详细介绍boost的序列化操作。
主要特征
- 代码可移植性强,仅依赖于标准C++
- 支持版本控制。当类定义更改时,较旧的文件仍可以导入到该类的新版本中
- 可以直接通过对象的指针保存和恢复数据
- 支持共享指针
- 支持STL容器和其他常用模板的序列化
- 平台可移植性,在一个平台上创建的字节流应在任何其他平台上均可读
- 支持非侵入性式序列化,即允许在类外写该类的序列化代码。这对于轻松地将序列化应用到我们不能或不想更改的类库中的类而言是必要的
- 可以序列化成多种形式的文档,比如二进制文档,文本文档,xml文档。同时存档接口简单,可以以轻松创建新型存档方式
详细介绍
boost序列化操作可以序列化各种数据类型:内置类型、stl容器、自定义类型、指针&应用等,几乎无所不能。下面详细介绍下具体的序列化方法:
序列化内置类型
可以序列化c++的内置类型如,int, double, float等。
序列化stl容器
可序列化stl的容器对象,需要包含对应名称的头文件,如序列化stl中的vector需包含如下头文件
#include <boost/serialization/vector.hpp>
序列化自定义类型(侵入式)
#include <fstream>
// include headers that implement a archive in simple text format
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
/
class gps_position
{
private:
// 因下面的serailize私有化,需要加该语句才能正常序列化
friend class boost::serialization::access;
// When the class Archive corresponds to an output archive, the
// & operator is defined similar to <<. Likewise, when the class Archive
// is a type of input archive the & operator is defined similar to >>.
// 通常将serialize放在私有域定义,不作为类的接口。
template<class Archive>
void serialize(Archive & ar, const unsigned int version){
ar & degrees;
ar & minutes;
ar & seconds;
}
int degrees;
int minutes;
float seconds;
public:
gps_position(){
};
gps_position(int d, int m, float s) :
degrees(d), minutes(m), seconds(s){
}
};
int main() {
// create and open a character archive for output
std::ofstream ofs("filename");
// create class instance
const gps_position g(35, 59, 24.567f);
// save data to archive
{
boost::archive::text_oarchive oa(ofs);
// write class instance to archive
oa << g;
// archive and stream closed when destructors are called
}