【发布时间】:2015-03-02 17:35:27
【问题描述】:
我想对一些结构化数据进行序列化/反序列化,以便通过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++ 中“正确”的方法是什么。定义一个类而不是一个结构更好。我应该重载一些运算符吗?是否有对齐问题需要考虑?
编辑:感谢您指出“char *”问题。提供的 C 版本不正确。 data 字段指向的数据部分应单独复制。
【问题讨论】:
-
是什么阻止你在 C++ 中做同样的事情?除了您似乎没有序列化
data字段这一事实之外,也不考虑结构填充之类的事情。 -
您也不会在 C 中通过网络按原样发送该结构。尝试一下,看看你是否没有得到垃圾或段错误。 (如果没有特殊安排,
data中存储的地址在创建它的进程之外没有任何意义。) -
“在 C 语言中,我会使用诸如...之类的东西。”你会大错特错。
sizeof (struct Message)可读、可维护并且正确。您的三种尺寸的总和都不是。 -
在 C 语言中,如果您有一个未知大小的数组
char data[];而不是指针char * data;,则可以这样做,只要对齐和字节排序不影响您。但这在标准 C++ 中并不完全支持。 -
“定义一个类比定义一个结构更好。” - 它们完全一样(除了默认的访问限制)。
标签: c++ oop serialization