Cereal library--一个C++11的序列化库

原文转载于:https://blog.csdn.net/u012348774/article/details/77871664

原文翻译自: 
http://uscilab.github.io/cereal/index.html

Cereal是一个只有头文件的C++11序列化库,支持将自定义数据类型使用压缩二进制、XML、JSON文件存储。Cereal是一个轻量级、快速,且极易扩展的库。特别的是Cereal不依赖任何三方库,非常容易使用。

全面支持C++11

Cereal几乎支持C++11标准中的所有类型,不仅如此还支持继承和多态两种特性。但是由于Cereal设计的初衷是轻量、快速,所以其在对象跟踪方面的性能与Boost有较大差异。因此,Cereal并不支持指针和引用,但是支持智能指针(例如std::shared_ptr、std::unique_ptr)。

Cereal支持大部分C++11的编译器 
由于Cereal使用了大量C++11中的新特性,因此需要一个能支持C++11的编译器。Cereal已经支持g++4.7.3、chang++3.3、和MSVC2013(及新版)。Cereal也许能在较老版本的编译器上工作,例如ICC,但是我们并不推崇和建议尝试。注意,当使用g++和chang++时,Cereal需要libstdc++和libc++支持。

简洁快速

经过简单的性能测试,对于简单的数据类型,Cereal比Boost的序列化库更快(包括其他序列化库),并且在二进制存储时使用更少的存储空间。Cereal使用了高效的XML、JSON解析器和生成器。与Boost相比,Cereal更简单和更容易使用。

易扩展 
Cereal具有非常优秀的二进制、XML、JSON序列化标准库。如果你想对其进行扩充,Cereal将非常适合您的使用。

可测试 
可喜可贺!为了保证Cereal能够正常完成指定的工作,我们编写了基本的单元测试代码(已经完成了部分测试)。测试单元的编译需要Boost unit test framework。

简单易用

Cereal使用非常简单,只需要Include头文件和编写一个serialization函数。Cereal具有非常完善的文档。当您在编译代码时,Cereal竭尽全力提供足够多的语法提示(自己翻译的:descriptive static assertions )。

语法简易 
如果您使用过Boost,或者计划使用Boost,那么使用Cereal并不会对你造成较大困扰。Cereal会寻找定义在数据结构中的serialization函数,当然serialization函数也可以是非成员函数。与Boost不同,Cereal并不需要指定serialization函数,而且也会在编译时提示您的错误。最后,如果您已经使用过Boost,请移步到“Boost到Cereal和的过渡”。

<span style="color:#000000"><code><span style="color:#009900">#include <cereal/types/unordered_map.hpp></span>
<span style="color:#009900">#include <cereal/types/memory.hpp></span>
<span style="color:#009900">#include <cereal/archives/binary.hpp></span>
<span style="color:#009900">#include <fstream></span>

<span style="color:#000088">struct</span> MyRecord
{
  uint8_t x, y;
  <span style="color:#000088">float</span> z;
  <span style="color:#880000">//第一种序列化方式</span>
  <span style="color:#000088">template</span> <<span style="color:#000088">class</span> Archive>
  <span style="color:#000088">void</span> serialize( Archive & ar )
  {
    ar( x, y, z );
  }
};

<span style="color:#000088">struct</span> SomeData
{
  int32_t id;
  <span style="color:#4f4f4f">std</span>::<span style="color:#4f4f4f">shared_ptr</span><<span style="color:#4f4f4f">std</span>::<span style="color:#4f4f4f">unordered_map</span><uint32_t, MyRecord>> data;

  <span style="color:#880000">//第二种序列化方式</span>
  <span style="color:#000088">template</span> <<span style="color:#000088">class</span> Archive>
  <span style="color:#000088">void</span> save( Archive & ar ) <span style="color:#000088">const</span>
  {
    ar( data );
  }

  <span style="color:#000088">template</span> <<span style="color:#000088">class</span> Archive>
  <span style="color:#000088">void</span> load( Archive & ar )
  {
    <span style="color:#000088">static</span> int32_t idGen = <span style="color:#006666">0</span>;
    id = idGen++;
    ar( data );
  }
};

<span style="color:#000088">int</span> main()
{
  <span style="color:#4f4f4f">std</span>::ofstream os(<span style="color:#009900">"out.cereal"</span>, <span style="color:#4f4f4f">std</span>::ios::binary);
  cereal::BinaryOutputArchive archive( os );

  SomeData myData;
  archive( myData );

  <span style="color:#000088">return</span> <span style="color:#006666">0</span>;
}</code></span>
#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 );
  }
};

int main()
{
  std::ofstream os("out.cereal", std::ios::binary);
  cereal::BinaryOutputArchive archive( os );

  SomeData myData;
  archive( myData );

  return 0;
}

自由协议 
Cereal使用了BSD协议,可满足大部分人群使用需求。

 

猜你喜欢

转载自blog.csdn.net/business122/article/details/81170967