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