Я пытаюсь работать с MSGPACK. У меня есть получатель и отправитель. Отправитель — клиент C ++, а получатель — сервер erlang.
Msgpack был великолепен, когда у меня был сервер Erlang и клиент Erlang. Я имел обыкновение отправлять и получать типы данных, такие как списки, кортежи, карты, двоичные файлы, erlang и msgpack: pack () и msgpack: unpack (). Но когда я начал менять своего отправителя на клиент C ++, я начал думать об этом:
Может msgpack упаковать пользовательские структуры данных, такие как классы и структуры. ? Что если у меня сложная структура и пакет, использующий msgpack: pack () и на стороне получателя, когда я использую msgpack: unpack (), я могу сказать, чтобы он декодировался в определенный тип данных, который меня интересует? может быть кортеж?
Благодарю. !
Может 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: pack () и на стороне получателя, когда я использую msgpack: unpack (), я могу сказать, чтобы он декодировался в определенный тип данных, который меня интересует? может быть кортеж?
Распаковывая данные в формате 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
Других решений пока нет …