использование msgpack для кодирования определенной пользователем структуры.

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

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

Благодарю. !

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: 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

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector