c++ - 位域的二进制 "bulk"序列化

标签 c++ serialization binary deserialization bit-fields

我有很多 bool 属性的对象,所以我使用位域来更紧凑地打包属性。我还希望能够以紧凑的方式序列化和反序列化这些属性,例如不是逐个字段,而是通过序列化和反序列化保存字段的 64 位 uint。这种方式不仅速度更快(例如,避免所有移位和其他东西),而且内存效率提高了 8 倍。

但是,我读到该标准不保证位域实现在不同平台上是统一的。我可以期望位域容器的“批量”二进制序列化会跨平台产生统一的结果吗?或者在使用属性时进行手动移位和屏蔽可能会更安全,以便可以进行批量序列化和反序列化?

最佳答案

你可以看看std::bitset :

它为 cast your bits into an unsigned long long 提供定义明确的函数, 和 create a bitset from a stored unsigned long long .定义 bitset 中的第一位是 ullong 表示的最低有效位。

所以你可以有这样的东西:

 std::bitset<N> bits;
 unsigned long long val = bits.to_ullong();
 // serialize your ullong value
 // load ullong from serialized data
 unsigned long long val2 = ...;
 std::bitset<N> newBits(val2);

因此,只要您的序列化能够正确加载/存储 unsigned long long,您就可以开始了。

唯一的问题是当您的位域对于 unsigned long long 来说太大时。在这种情况下,标准没有提供提取位域的简单方法。

关于c++ - 位域的二进制 "bulk"序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25017902/

相关文章:

java - 测试这个的最佳方法是什么? 4位二进制数

c - 如何计算没有。包含子字符串 "00"的二进制字符串?

c++ - 构造一个包含二进制数组的 hexValue 的字符串

C++ CreateProcess - 系统错误 #2 找不到文件 - 我的文件路径有什么问题?

c# - 如何将远程 URL 中的图像序列化为 IsolateStorage 或 XML?

c# - 返回空属性的数组的 SingleValueArrayConverter

python - 在 python 中处理时创建图像文件的副本

c++ - 在显示对象时获取垃圾值

c++ - while 循环和 getchar()

c# - 如何使用填充数组的类型对象的属性序列化类