【问题标题】:How to serialize Objects in C++ via copying memory?如何通过复制内存在 C++ 中序列化对象?
【发布时间】:2012-01-09 22:15:52
【问题描述】:

在 C++ 中是否可以通过获取对象首地址的指针并递增该指针直到到达对象末尾来序列化对象?

如果可能的话,我怎样才能找到对象的第一个内存地址以及我应该将值存储在哪种数据类型中?我怎样才能在另一边构建对象?

【问题讨论】:

  • 为什么要序列化。是将对象发送到另一个进程或计算机,还是可以将其写入文件?
  • 这里有一些你需要考虑的事情:(1)如何处理具有非平凡构造函数的类; (2)如何处理对象中包含的指针/引用; (3)如何处理虚基类。
  • 可能通过 tcp 套接字或其他方式发送它。

标签: c++ arrays serialization object


【解决方案1】:

这在一些非常严格的情况下相对容易做到(POD 没有指针/引用;相同的操作系统、CPU 架构和序列化管道两端的 C++ 编译器)。

在更一般的情况下,有许多问题会使事情复杂化:

  1. 处理具有重要构造函数/析构函数的类;
  2. 处理对象中包含的指针/引用;
  3. 指针/参考图中的循环;
  4. 多态性;
  5. 处理虚拟基类;
  6. 字节序;
  7. 字段对齐、填充等;
  8. 原始类型的宽度(一个平台上的int 不一定与另一个平台上的int 大小相同);
  9. 版本控制,以便可以在不破坏内容的情况下添加新字段。

【讨论】:

  • 即使在不包含指针或引用的 POD 中,它也可能由于字段之间的填充而失败。
  • @Jerry:取决于 aix 的意思,“相同的操作系统、CPU 架构和 C++ 编译器”。如果这两个实现共享一个 C ABI,那么它们必然具有相同的 POD 结构布局。但编译器选项会影响这一点。
  • @SteveJessop:使用 #pragma pack 之类的东西来强制 ABI 中使用的结构进行特定对齐是很常见的,但在其他结构中仍然存在变化,因此共享 ABI 并不一定意味着很多。
【解决方案2】:

您描述的过程将创建对象的平面副本。如果该对象包含指针或引用本身,则此方案将中断。

如果要序列化对象,请使用 Boost.Serialization 之类的库。

【讨论】:

  • 即使不是这样,它也是完全不可移植的,因为它暴露了诸如对齐、填充、字节序和类型大小等实现细节。
【解决方案3】:

有多种序列化格式(XDR、ASN1、JSON、YAML)、技术和库(如 C++ 的 s11n

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 2010-10-06
    • 2014-01-30
    相关资源
    最近更新 更多