C++ 谷物:序列化 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:注意:候选模板被忽略:替换 失败:可变修改的类型"无符号字符 (&([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 类型上,则需要遍历每个对象并单独序列化它。
相关文章:
- 将包含C样式数组的对象初始化为成员变量(C++)
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- 如何在谷歌模拟中匹配 C 样式数组
- 迭代器库中的 std::size() 不适用于传递给函数的 C 样式数组
- 解压缩 C 样式数组以及C++中的参数包
- 复制 C 样式数组和结构
- C++中循环和 C 样式数组的范围工作
- C++ - 移动具有固定大小的 c 样式数组成员的类的构造函数
- std::array与C样式数组用于连续内存
- 从原始指针(衰减的 C 样式数组)和大小生成范围::视图
- 不要声明 C 样式数组,而是使用 std::array<>
- 带C++的 C 样式数组?
- 如何从嵌套的 std::initializer_list 初始化 2D C 样式数组?
- 将 unique_ptr<std::vector> 与 c 样式数组结合使用
- 为什么我不能将 C 样式数组复制到 std::array?
- 函数需要 C 样式数组
- 键入 trait 以获取 std::array 或 C 样式数组的元素类型
- 何时需要删除 C 样式数组
- C++ C 样式数组作为语法错误的参数