我目前正在尝试在用 C 编写的项目中使用 msgpack。我正在使用 msgpack 来序列化结构的内容,然后将其通过网络发送,并反序列化回相应的结构另一边。
我正在尝试做的精简版:
#include <stdio.h>
#include <msgpack.h>
#include <stdbool.h>
typedef someStruct{
uint32_t a;
uint32_t b;
float c;
} someStruct;
int main (void){
someStruct data;
/* ... Fill 'data' with some data for test purposes ...*/
msgpack_sbuffer* buff = msgpack_sbuffer_new();
msgpack_packer* pck = msgpack_packer_new(buff, msgpack_sbuffer_write);
someStruct* structs = malloc(sizeof(someStruct) * 10);
/* ... Fill 'structs' with members containing test data ... */
// Serialize
msgpack_pack_array (pck, 10);
int i;
for(i = 0 ; i < 10 ; i++){
msgpack_pack_array (pck, 3);
msgpack_pack_uint32 (pck, structs[i].a);
msgpack_pack_uint32 (pck, structs[i].b);
msgpack_pack_float (pck, structs[i].c);
}
free(structs);
msgpack_packer_free(pck);
// Deserialize
msgpack_unpacked msg;
msgpack_unpacked_init(&msg);
bool deserialize_success = msgpack_unpack_next
(&msg, buff->data, buff->size, NULL);
if(!deserialize_success) /* Error */
msgpack_object obj = msg.data;
msgpack_object_print(stdout,obj); // This seems to work perfectly, indicating serialize / deserialize works as intended...
someStruct deserialized_data;
/* Insert code to extract and cast deserialized data to 'deserialized_data */
// Clean
msgpack_sbuffer_free(buff);
msgpack_packer_free(pck);
return 0;
}
列出的代码或多或少直接来自这里,这似乎是 msgpack-c 上为数不多的资源之一。
谁能指出我正确的方向,以“重新创建”电线另一侧的原始结构?我发现实际利用反序列化数据的唯一方法是使用 msgpack_object_print() 调用从 messagepack_object 打印。但是,这确实有效,因此我确定数据在那里。
我是否需要以某种方式遍历序列化数据并使用带有偏移量的 msgpack_unpack_next() 来检索每个 someStruct 成员?使用 memcpy 到本地字节缓冲区?
任何帮助是极大的赞赏!