【问题标题】:C++ Cereal: serialize C-style arrayC++ Cereal:序列化 C 风格的数组
【发布时间】:2014-12-17 04:52:38
【问题描述】:

可以/如何使用cereal 库序列化数组。

void save(Archive & ar, const unsigned int version) const
{
    unsigned int l  = g1_size_bin(g,POINT_COMPRESS);
    uint8_t data[l];
    memset(data, 0, l);
    g1_write_bin(data, l, g,POINT_COMPRESS);
    ar(l);
    ar(data); // what should be here
}

那行不通(我也不希望它也这样)。也没有

ar(cereal::binary_data(data,l)); 

(我认为这会起作用,因为它看起来像人们会使用的 boost 代码),这会产生编译错误:

/usr/local/include/cereal/cereal.hpp:79:17: 注意:候选模板被忽略:替换 失败:可变修改类型'unsigned char (&)[l]'不能用作模板 争论 BinaryData binary_data(T && data, size_t size )

也没有

ar.saveBinaryValue(data,l);

由于该方法似乎只支持 XML/Json,我想要一个二进制存档。

【问题讨论】:

    标签: c++ cereal


    【解决方案1】:

    cereal::binary_data 是在这种情况下使用的正确构造,假设您想要 POD 数组的二进制表示。这仅适用于支持binary_data(二进制和可移植二进制)的档案。 binary_data 不适用于基于文本的存档,因为它被视为对更通用的序列化方法的优化 - 请参阅向量是如何序列化的示例。

    无论如何,这是一个序列化 C 样式数组的工作示例:

    #include <cereal/archives/binary.hpp>
    #include <iostream>
    
    int main()
    {
      std::stringstream ss;
    
      {
        cereal::BinaryOutputArchive ar(ss);
        std::uint8_t data[] = {1, 2, 3};
        ar( cereal::binary_data( data, sizeof(std::uint8_t) * 3 ) );
      }
    
      {
        cereal::BinaryInputArchive ar(ss);
        std::uint8_t data[3];
        ar( cereal::binary_data( data, sizeof(std::uint8_t) * 3 ) );
    
        for( int i : data )
          std::cout << i << " ";
      }
    
      return 0;
    }
    

    如果您想将 C 样式数组序列化为基于文本的存档,或者如果您的数组不是 POD 类型,则需要遍历每个对象并单独对其进行序列化。

    【讨论】:

    • 我有一个数组(在堆上),其中包含 N 个内部 2x 双精度结构(x 和 y)我应该迭代每个结构以进行序列化吗?
    • 如果你将ar重命名为a,这段代码看起来会更漂亮。
    • 我正在寻找与序列化和cereal 相关的另一件事,我遇到了这个答案。但我有个问题。 ss 默认只有std::ios_base::in | std::ios_base::out 模式。它不会造成问题吗?它不应该有std::ios_base::binary 开放模式吗?
    • @ArdaAytekin 你是对的 - 为了安全起见(不幸的是更冗长),std::ios_base::binary 应该与适当的输入或输出标志一起提供。
    • 谷物棒极了。但很遗憾不同的档案提供不同的界面。现在我的代码需要知道存档类型。有统一的界面吗?
    猜你喜欢
    • 2020-09-14
    • 2018-05-14
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 2018-12-19
    相关资源
    最近更新 更多