【问题标题】:Data structure alignment to implement serialize in C++在 C++ 中实现序列化的数据结构对齐
【发布时间】:2012-04-08 19:13:13
【问题描述】:

我了解数据结构对齐的理论并使用该理论来实现序列化。 但是,我很难开始使用真正的代码。 谁能给我一个简单的例子来说明这是如何工作的?

假设:

 Class A {
  private:
     int a;
     char b;
     double c;
     char d;
     char e;
   public:
     void serialize(char * str);
 };

如何实现序列化方法来存储对齐的数据A?我应该重新排序数据结构并填充它吗?或者...

【问题讨论】:

  • 内存数据对齐和序列化是两个正交的方面。事实上,一旦数据被序列化为字节流,对齐就不再是问题了。
  • @MatthiasVallentin 请在有人提议使用memcpy 或一些类似功能之前将您的评论转化为答案。
  • 与其自己进行序列化,不如检查 Google 协议缓冲区:code.google.com/p/protobuf ...它将为您处理很多细节,“正确的方式”。
  • 你不需要做任何事情来获得数据结构对齐。编译器会为你做这件事。你的问题还不清楚。

标签: c++ serialization memory-alignment


【解决方案1】:

对齐和序列化是两个正交的方面。

前者涉及数据结构的内存表示,而后者涉及其以顺序形式的等效表示。换句话说,一旦数据结构被序列化为字节流,对齐就不再重要了。同样,当引用序列化字节流时,对齐的概念也没有意义。

也就是说,您应该分别解决每个问题,而不是试图找到一个共同的解决方案。

【讨论】:

  • 思路是我们首先需要对齐数据结构,才能得到小的sizeof(DATA STRUCTURE)。然后,使用 memcpy() 将值传递给 char*。这样,就将缓冲区发送出去了。
  • 如果您计划以任何方式共享序列化结构(例如,通过网络发送,将其写入其他机器可能读取的文件),您将遇到memcpy 的麻烦方法。然后对齐就成为众多问题之一,例如,您还必须考虑字节顺序。这不是序列化数据结构的方式。 (@Andre 已经在评论中暗示了这一点。)
猜你喜欢
  • 2010-09-27
  • 2013-06-03
  • 2023-03-23
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 2021-09-21
相关资源
最近更新 更多