Cereal快速入门

2020-02-04  本文已影响0人  啊呀哟嘿

本文主要参考官方使用指南

Cereal是一个轻便的C++序列化工具。

安装使用

为了在项目中使用cereal,只需要从Github上下载,随后让项目使用cereal_base_dir/include/cereal即可,无需编译。

选择归档方式

Cereal支持二进制、XML和JSON归档。可以根据需要引用头文件:

#include <cereal/archives/binary.hpp>
#include <cereal/archives/portable_binary.hpp>
#include <cereal/archives/xml.hpp>
#include <cereal/archives/json.hpp>

类的序列化

Cereal需要知道类中哪些数据成员需要被序列化,为此,要在类中实现一个serialize方法:

struct MyClass
{
  int x, y, z;

  // This method lets cereal know which data members to serialize
  template<class Archive>
  void serialize(Archive & archive)
  {
    archive( x, y, z ); // serialize things by passing them to the archive
  }
};

序列化数据

为了序列化数据,首先需要创建一个cereal archive,随后向其中发送数据。应当通过RAII(Resource Acquisition Is Initialization,资源获取即初始化)的方式使用Cereal archive以保证数据被正常地存储或读取。Cereal archive通常以一个std::istream/std::ostream或者std::ifstream/std::ofstream对象作为参数来构造。

#include <cereal/archives/binary.hpp>
#include <sstream>

int main()
{
  std::stringstream ss; // any stream can be used

  {
    cereal::BinaryOutputArchive oarchive(ss); // Create an output archive

    MyData m1, m2, m3;
    oarchive(m1, m2, m3); // Write the data to the archive
  } // archive goes out of scope, ensuring all contents are flushed

  {
    cereal::BinaryInputArchive iarchive(ss); // Create an input archive

    MyData m1, m2, m3;
    iarchive(m1, m2, m3); // Read the data from the archive
  }
}

Naming values

在一些场合(尤其是希望将数据归档为XML或者JSON时),常常会希望构建“名称/值”对(name-value pair)来帮助阅读。常见的方法有CEREAL_NVP(D)``cereal::make_nvp(N, V)

#include <cereal/archives/xml.hpp>
#include <fstream>

int main()
{
  {
    std::ofstream os("data.xml");
    cereal::XMLOutputArchive archive(os);

    MyData m1;
    int someInt;
    double d;

    archive( CEREAL_NVP(m1), // Names the output the same as the variable name
             someInt,        // No NVP - cereal will automatically generate an enumerated name
             cereal::make_nvp("this_name_is_way_better", d) ); // specify a name of your choosing
  }

  {
    std::ifstream is("data.xml");
    cereal::XMLInputArchive archive(is);
    
    MyData m1;
    int someInt;
    double d;

    archive( m1, someInt, d ); // NVPs not strictly necessary when loading
                               // but could be used (even out of order)
  }
}

其他

关于RAII资源获取即初始化,可以参考:
https://www.jianshu.com/p/b7ffe79498be

上一篇下一篇

猜你喜欢

热点阅读