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

标签 c++ erlang msgpack

我正在尝试使用 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/

相关文章:

erlang - 列表到元组列表的转换

python - 在 python 中从响应中解压 msgpack

java - 如何从正在使用的文件中读取

c++ - 如何将 std::vector<boost::shared_ptr<T>> 复制到 std::list<T>

mysql - 无法使用 mysql 在 ejabberd 中启动模块 mod_last_odbc

debugging - 数据库 :tracer visualizing recursive functions e. 克。通过缩进

c - 消息包 C API

redis - 如何在redis-cli中查看解码后的消息包数据

c++ - 如何在CTR模式下寻找并解密部分码流?

c++ - VC++ 中的异常错误 c0000005