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 从多个流输入缓冲区进行组装。
我不喜欢静态方法。与反序列化相关的协议状态数据应该是每个实例,(线程安全)。
我想要 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 从多个流输入缓冲区进行组装。
我不喜欢静态方法。与反序列化相关的协议状态数据应该是每个实例,(线程安全)。