【问题标题】:How to prepare msgpack to send a struct over a ZeroMQ infrastructure?如何准备 msgpack 通过 ZeroMQ 基础设施发送结构?
【发布时间】:2018-06-12 14:48:21
【问题描述】:

我正在尝试通过 ZeroMQ 在节点之间进行通信。我需要发送struct 的:

struct Content{
    std::vector<cv::Mat> image;
    std::string msg;
};

我尝试使用msgpack

Content content;
content.image = msg2;
content.mesaj = "naber kardes";

msgpack::type::tuple<Content> src(content);
//                            serialize the object into the buffer.
//                            any classes that implements
//                            write(const char*,size_t) can be a buffer.
std::stringstream buffer;
msgpack::pack(buffer, src);
cout << sizeof(buffer) << endl;

但它给出了:

/usr/local/include/msgpack/v1/object.hpp:631:11:错误:“内容”中没有名为“msgpack_pack”的成员

还是 C++ 新手。

如何在 msgpack 的帮助下通过 ZeroMQ 发送我的内容结构?

【问题讨论】:

    标签: c++ c++11 msgpack


    【解决方案1】:

    你需要为你的Content结构提供一个pack()函数:

    namespace msgpack
    {
    MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS)
    {
    namespace adaptor
    {
    
    template <>
    struct pack<Content> {
        template <typename Stream>
        msgpack::packer<Stream>& operator()(
                    msgpack::packer<Stream>& out, Content const& obj) const
        {
            out.pack(obj.image);
            out.pack(obj.msg);
            return out;
        }
    };
    
    }
    }
    }
    

    如果您的软件不评估 MessagePack 数据,您需要根据您的 zmq/MessagePack 接收者的格式/布局期望创建 pack() 函数。

    convert() 函数示例(与上述 pack() 函数相同的命名空间):

    template <>
    struct convert<Content> {
        msgpack::object const& operator()(
                    msgpack::object const& o, Content& v) const
        {
            // unpack data in the same format as it was packed. see above!     
            return o;
        }
    };
    

    【讨论】:

    • 非常感谢。如果您有时间,您能否完成示例 :) 以发送 zeromq,而不是在另一个节点中反序列化。是的,要求很多,但作为一个 Java 女孩最后 2 小时,所有代码看起来都像 java 并且开始令人困惑。它也可以帮助其他陷入困境的新手
    • 我添加了行来打包 obj.image 和 obj.msg。您需要为上述样式的 cv::Mat 提供一个打包器,或者您可以在上面的示例中打包 obj.image 的内容。例如包装向量的长度,后跟每个 cv::Mat 元素的 N 个元素。
    • 谢谢 Jens.. 我会尽力让你知道的。有时我认为所有政治家也应该有一个stackoverflow :) 并且应该让他们开源..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多