繁体   English   中英

C ++ Cereal:序列化C风格的数组

[英]C++ Cereal: serialize C-style array

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

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)); 

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

/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,我想要一个二进制存档。

cereal::binary_data是在这种情况下使用的正确构造,假设您需要POD数组的二进制表示。 这仅适用于支持binary_data (binary和portable_binary)的归档。 binary_data不适用于基于文本的归档,因为它被视为更通用的序列化方法的优化 - 请参阅如何序列化vector以获取此示例。

无论如何,这是一个序列化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类型,则需要迭代每个对象并单独对其进行序列化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM