C++中的对象序列化

Object serialization in C++

我想要 serialize/deserialize 一些结构化数据,以便通过 char* buffer 通过网络发送。

更准确地说,假设我有一条类型为 struct Message 的消息。

struct Message {
        Header header;
        Address address;
        size_t size; // size of data part
        char* data;
    } message 

在 C 中,我会使用诸如:

  size = sizeof(Header) + sizeof(Address) + sizeof(size_t) + message.size;
  memcpy(buffer, (char *) message, size);

序列化,

Message m = (Message) buffer;

反序列化。

在 C++ 中 "right" 的方法是什么。定义 class 而不是结构更好吗?我应该重载一些运算符吗?是否有对齐问题需要考虑?

编辑:感谢您指出 "char *" 问题。提供的 C 版本不正确。 data字段指向的数据段应该单独复制。

其实有很多种口味:

你可以提升让它为你做:http://www.boost.org/doc/libs/1_52_0/libs/serialization/doc/tutorial.html

重载流运算符 << 用于序列化和 >> 用于反序列化适用于文件和字符串流

您可以指定构造函数 Message (const char*) 以从 char* 构造。

我是反序列化静态方法的粉丝,例如:

Message {
  ...
  static bool desirialize (Message& dest, char* source);
}

因为您可以在反序列化时直接捕获错误。

而且你提出的版本是可以的,应用时评论中的修改将得到尊重。

为什么不在您的继承树中插入虚拟 'NetworkSerializable' Class? 'void NetSend(fd socket)' 方法将发送内容(不暴露任何私有数据),并且 'int(bufferClass buffer)' 可以 return -1 如果没有完整的有效消息被反序列化,或者如果有效消息已被反序列化已组装,'buffer'.

中未使用的字符数

将所有 assembly/disassembly 协议状态变量和其他 gunge 封装在 class 所属的位置。它还允许 message/s 从多个流输入缓冲区进行组装。

我不喜欢静态方法。与反序列化相关的协议状态数据应该是每个实例,(线程安全)。