可以/如何使用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));
(我认为它可以工作,因为它看起来像一个人会使用的增强代码),这会产生编译错误:
/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,我想要一个二进制存档。
答案 0 :(得分:7)
cereal::binary_data
是在这种情况下使用的正确构造,假设您需要POD数组的二进制表示。这仅适用于支持binary_data
(binary和portable_binary)的归档。 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类型,则需要迭代每个对象并单独对其进行序列化。