在msgpack的c ++实现中,如何使用pack_map或pack_array序列化对象后反序列化对象?

时间:2013-06-23 14:14:25

标签: c++ msgpack

http://wiki.msgpack.org/pages/viewpage.action?pageId=1081387#QuickStartforC%2B%2B-Streamingintoanarrayormap给出的示例中,如果c ++实现中的项目不是同一类型,如何从数组或映射中解压缩(当使用pack_map和pack_array时)?

如果它们属于同一类型,我可以使用pack_map执行此操作:

msgpack::sbuffer buffer;
msgpack::packer<msgpack::sbuffer> pk(&buffer);

pk.pack_map(2);

pk.pack(std::string("string"));
pk.pack(std::string("hello"));
pk.pack(std::string("vector"));
pk.pack(std::string("map"));

msgpack::unpacker pac;

pac.reserve_buffer(buffer.size());

memcpy(pac.buffer(), buffer.data(), buffer.size());
pac.buffer_consumed(buffer.size());

// deserialize it.
msgpack::unpacked msg;
pac.next(&msg);
msgpack::object obj = msg.get();

std::map<std::string, std::string> resultMap;

obj.convert(&resultMap);

但是,如果值的类型不同,我显然不能这样做。

如果这是c ++实现的限制那么公平。

由于

1 个答案:

答案 0 :(得分:3)

我偶然发现了你的问题,同时寻找更多的msgpack信息。在我使用msgpack序列化地图的情况下,地图是字符串到变体对象(包含不同类型的对象),所以修改你的例子我会像这样序列化:

pk.pack_map(2);

pk.pack(std::string("string"));
pk.pack(std::string("hello"));
pk.pack(std::string("vector"));
pk.pack(1); // NOTE integer here

然后在解码时我会这样做:

typedef std::map<std::string, msgpack::object> MapStrMsgPackObj;
// deserialize it.
msgpack::unpacked msg;
pac.next(&msg);
msgpack::object obj = msg.get();
MapStrMsgPackObj mmap = obj.as<MapStrMsgPackObj>();

然后迭代收到的地图。希望有所帮助。