2016-11-30 5 views
1

Im пытается работать с msgpack. У меня есть приемник и отправитель. Sender - клиент C++, а получатель - сервер erlang. Msgpack был совершенно здорово, когда у меня был сервер erlang и клиент erlang. Я использовал для отправки и получения типов данных, таких как списки, кортежи, карты, двоичные, erlang и msgpack: pack() и msgpack: unpack() были полностью в порядке. Но когда я начал менять отправителя на клиент C++, я начал думать об этом:с использованием msgpack для кодирования определенной пользователем структуры.

Может ли msgpack собирать пользовательские структуры данных, такие как классы и структуры. ? Что делать, если у меня сложная структура и пакет, которые используют msgpack: pack() и на конце приемника, когда я использую msgpack: unpack() могу ли я сказать, что он декодируется для определенного типа данных, которого я интересую? может быть кортеж?

Спасибо. !

+0

http://www.thomaswhitton.com/блог/2013/07/03/бинарные-сообщение формата-с-плюс-плюс-примеры /. Проверьте раздел пакета сообщений. – Arunmu

ответ

1

Может ли msgpack устанавливать пользовательские структуры данных, такие как классы и структуры. ?

Да, вы можете это сделать. msgpack-c поддерживает как C, так и C++. И я написал о части C++ в msgpack-c. msgpack-c может упаковывать любые типы адаптеров. Ниже приведен список предварительно поддерживаемых типов C++ https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_adaptor

И вы также можете написать адаптеры для определенных пользователем типов. Самый простой подход - использование MSGPACK_DEFINE (сопоставлено с ARRAY) или MSGPACK_DEFINE_MAP (сопоставлено с MAP).

Вы можете комбинировать и комбинировать любые типы, если у типов есть адаптеры. Если вы напишете MSGPACK_DEFINE в your_type, вы можете упаковать std::vector<std::map<std::string, your_type> >.

Что делать, если у меня есть сложная структура и пакет, который с помощью msgpack: пакет() и на приемном конце, когда я использую msgpack: распаковать() я могу сказать ему, чтобы декодировать к конкретному типа данных Im заинтересованы в? может быть кортеж?

При распаковке форматированных данных MessageePack вы получаете msgpack::object_handle. См. https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_unpacker.

Тогда вы можете получить msgpack::object от msgpack::object_handle. Наконец, вы можете конвертировать из msgpack::object в любые типы, которые имеют адаптеры, используя функцию-член as(). См https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_object#conversion

Вот пример кода:

#include <iostream> 
#include <sstream> 
#include <cassert> 
#include <msgpack.hpp> 

struct your_type { 
    int a; 
    int b; 
    MSGPACK_DEFINE(a, b); 
}; 

bool operator==(your_type const& lhs, your_type const& rhs) { 
    return lhs.a == rhs.a && lhs.b == rhs.b; 
} 

int main() { 
    // packing 
    std::stringstream ss; 
    std::vector<std::map<std::string, your_type>> v 
    { 
     { 
      { "key1", {1,2} }, 
      { "key2", {3,4} } 
     }, 
     { 
      {"key3", {5, 6} } 
     } 
    }; 
    msgpack::pack(ss, v); 

    // unpacking 
    msgpack::object_handle oh = msgpack::unpack(ss.str().data(), ss.str().size()); 
    msgpack::object const& obj = oh.get(); 
    std::cout << "object: " << obj << std::endl; 

    // converting 
    auto v2 = obj.as<std::vector<std::map<std::string, your_type>>>(); 
    assert(v == v2); 
} 

И вы можете работать, и изменить его в Wandbox, онлайн среду компилятора: http://melpon.org/wandbox/permlink/M229kOVY6ys83pwb

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

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