gpt4 book ai didi

c++ - 使用 msgpack 对用户定义的结构进行编码。

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:44 63 4
gpt4 key购买 nike

我正在尝试使用 msgpack。我有一个接收者和一个发送者。发送方是一个 c++ 客户端,接收方是一个 erlang 服务器。当我有一个 erlang 服务器和一个 erlang 客户端时,Msgpack 非常棒。我曾经发送和接收数据类型,如列表、元组、映射、二进制、erlang 和 msgpack:pack() 和 msgpack:unpack() 完全没问题。但是当我开始将我的发件人更改为 c++ 客户端时,我开始考虑这个问题:

msgpack 能否打包用户定义的数据结构,如类和结构。 ?如果我有一个复杂的结构并使用 msgpack:pack() 打包,在接收端,当我使用 msgpack:unpack() 时,我可以告诉它解码为我感兴趣的特定数据类型吗?可能是一个元组?

谢谢。 !

最佳答案

Can msgpack pack user-defined data-structures like classes and structures. ?

是的,你可以做到。 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> > .

What if I have a complex structure and pack that using msgpack:pack() and on the receiver end, when I use msgpack:unpack() can I tell it to decode to a specific data-type Im interested in? may be a tuple ?

当您解压 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

关于c++ - 使用 msgpack 对用户定义的结构进行编码。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40896477/

63 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com