我正在尝试序列化作为UDP消息发送的结构。我遇到的问题是该结构包含一个可变长度的子结构数组,如下所示:
struct SubStruct
{
short val1;
short val2;
};
struct Message
{
short numSubStructs;
SubStruct* structs;
};
我用于发送固定长度消息的方法是将结构转换为unsigned char*
。低于MSG_LENGTH
等于sizeof(short) + numSubStructs * sizeof(SubStruct)
send(socket, reinterpret_cast<unsigned char*>(&someMessage), MSG_LENGTH);
这对我所有的固定长度消息都很好,但对可变长度消息却不行。查看通过套接字发送的数据,我很确定它正在发送structs指针的实际地址。
我的问题是,除了循环遍历指针(数组)并附加到某个缓冲区之外,是否有一种方法可以序列化这种结构?
谢谢
答案 0 :(得分:1)
尝试这样的事情:
char *serializedMessage = new char[sizeof(short) + someMessage.numSubStructs * sizeof(SubStruct)];
// Error check here
// Insert the count of structs
memcpy(serializedMessage, &someMessage.numSubStructs, sizeof(short));
// Copy the structs themselves.
memcpy(&serializedMessage[sizeof(short)], someMessage.structs,
someMessage.numSubStructs * sizeof(SubStruct));
// Transmit serializedMessage
delete[] serializedMessage;
注意。这并不关注数据的字节性,因此,如果源计算机和目标计算机具有不同的字节性,则很有可能失败。
答案 1 :(得分:0)
我不知道用C ++做到这一点的优雅方法。但是有一些丑陋的方法。基本上,分配一个足以容纳整个“展开”结构和子结构的缓冲区。如果结构的最后一个成员是可变大小的元素,则维护起来还不错。如果有多个嵌套结构,那么它将变得笨拙。
这是C风格的示例。
struct example{
int array_length;
some_struct array[1]; // beware of padding in structure between the fields
}
int number_of_structs = 2;
example* ptr = malloc(sizeof(int)+ number_of_structs*sizeof(some_struct));
ptr->array_lenth = number_of_structs;
ptr->array[0].first_field = 1;
ptr->array[1].first_field = 2;
send(socket, ptr, sizeof(int)+ number_of_structs*sizeof(some_struct));
还有一些(非标准)使用zero length arrays的方法。