美文网首页
Cereal快速入门

Cereal快速入门

作者: 啊呀哟嘿 | 来源:发表于2020-02-04 09:54 被阅读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

    相关文章

      网友评论

          本文标题:Cereal快速入门

          本文链接:https://www.haomeiwen.com/subject/yymjxhtx.html