在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 ++实现的限制那么公平。
由于
答案 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>();
然后迭代收到的地图。希望有所帮助。