C++ 谷物:序列化 C 样式数组

C++ Cereal: serialize C-style array

本文关键字:样式 数组 序列化 谷物 C++      更新时间:2023-10-16

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

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:注意:候选模板被忽略:替换 失败:可变修改的类型"无符号字符 (&([L]"不能用作模板 论点 BinaryData binary_data( T && data, size_t size (

也没有

ar.saveBinaryValue(data,l);

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

cereal::binary_data是在这种情况下使用的正确结构,假设您想要 POD 数组的二进制表示形式。 这仅适用于支持binary_data(二进制和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 类型上,则需要遍历每个对象并单独序列化它。