2013-06-23 1 views
2

В примере, приведенном на http://wiki.msgpack.org/pages/viewpage.action?pageId=1081387#QuickStartforC%2B%2B-Streamingintoanarrayormap, как я могу распаковать элементы из массива или карты (при использовании pack_map и pack_array) в реализации C++, если они не одного типа?Как удалить сериализацию объектов после их сериализации с помощью pack_map или pack_array, в реализации C++ в msgpack?

Если они одного и того же типа, что я могу сделать это с 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++, то достаточно справедливо.

Благодаря

ответ

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>(); 

И затем перебирать полученную карту. Надеюсь, это поможет.

+0

Почему std :: unordered_map не поддерживается? – xunzhang

 Смежные вопросы

  • Нет связанных вопросов^_^