cereal —— C++11 序列化库
介绍
cereal是一个只包含头文件的C++序列化库,cereal支持任何类型的数据并可以将其序列化为不同形式,例如:二进制、XML或者JSON。
cereal的设计理念是快速、轻量级和容易扩展——cereal没有依赖第三库而且可以轻易的将其和其他代码相。
cereal 完整支持 C++11
cereal 已经支持 C++11 标准库中的所有类型了,而且 cereal 也完全支持继承和多态。为了保持 cereal 的简洁性并不降低性能,cereal 没有像 Boost 等库那样跟踪并序列化类中所有成员变量。cereal不支持原始指针和引用对象的序列化,但智能指针是支持的。
cereal 支持众多符合C++11标准的编译器
cereal 使用了很多C++11与编译器的特性。cereal 官方支持 g++4.7.3、clang++3.3、MSVC 2013或者更新的编译器。cereal可能支持其他类型或版本的编译器,比如ICC,但cereal不保证完全可用。在使用g++或者clang++时,cereal可以与libstdc++和libc++一起编译与执行。
cereal 小巧且迅速
一些简单的性能测试表名,cereal一般比Boost中的序列化库(或者其他库)要快,并且如果使用二进制文件存储序列化后的对象(数据),cereal占用的空间更小,这些特点在序列化小对象时更加明显。cereal使用了C++中最快的XML和JSON解析库。cereal的代码相对于其他库如Boost而言更加容易理解且更易扩展。
cereal 是可扩展的
cereal支持将序列化后的对象保存为XML、JSON、和二进制格式。如果需要,你可以添加自己想要的序列化文件格式和其他需要被序列化的数据类型(如自定义类,cereal默认只支持标准库中的类)。
cereal 有单元测试
为了保证库的可用性与可靠性,我们为cereal编写了单元测试。cereal使用了Boost 单元测试框架,所以运行这些单元测试需要配置Boost库。
cereal 很容易使用
cereal的使用是非常简单的,包含头文件并编写序列化语句既可。cereal有优秀的文档来描述其自身的概念和代码。cereal近最大可能在编译时识别并报告你代码中的错误。
cereal 提供了与Boost类似的语法
如果你使用过Boost中的序列化库,那么你使用cereal是就会感觉到很熟悉,cereal的设计使得熟悉boost的用户容易学习。cereal在对象的方法或者非成员函数中寻找序列化函数。与Boost不同,你不需要告诉cereal你序列化对象的类型。如果你曾经使用过Boost,请查看我们的迁移手册。
下面是一个示例:
#include <cereal/types/unordered_map.hpp>
#include <cereal/types/memory.hpp>
#include <cereal/archives/binary.hpp>
#include <fstream>
struct MyRecord
{
uint8_t x, y;
float z;
template <class Archive>
void serialize( Archive & ar )
{
ar( x, y, z );
}
};
struct SomeData
{
int32_t id;
std::shared_ptr<std::unordered_map<uint32_t, MyRecord>> data;
template <class Archive>
void save( Archive & ar ) const
{
ar( data );
}
template <class Archive>
void load( Archive & ar )
{
static int32_t idGen = 0;
id = idGen++;
ar( data );