gpt4 book ai didi

C++ Cereal : serialize C-style array

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:28:31 24 4
gpt4 key购买 nike

你能/如何使用 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 && 数据, size_t 大小)

也没有

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 类型,您将需要遍历每个对象并单独序列化它。

关于C++ Cereal : serialize C-style array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27518554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com