msgpack 可以打包用户定义的数据结构,如类和结构。 ?
是的,你可以做到。 msgpack-c 支持 C 和 C++。我写了关于 msgpack-c 的 C++ 部分。 msgpack-c 可以打包任何具有适配器的类型。这是一个预先支持的 C++ 类型列表https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_adaptor
您还可以为用户定义的类型编写适配器。最简单的方法是使用 MSGPACK_DEFINE(映射到 ARRAY)或 MSGPACK_DEFINE_MAP(映射到 MAP)。
只要类型具有适配器,您就可以组合和组合任何类型。如果在your_type中写MSGPACK_DEFINE,就可以打包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_handle得到msgpack::object。最后,您可以使用as() 成员函数将msgpack::object 转换为具有适配器的任何类型。
见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