自定义数据序列化 msgpack object & zone 和 wamp_message 的打包,发送

方法1 . 对于自定义数据,想通过 msgpack 打包,只需要加上 MSGPACK_DEFINE 宏 (对于版本 v1.1.x - v1.4.x), 例如

e.g 1:

struct MyPoint {
    int x;
    int y;
    MSGPACK_DEFINE(x, y);
};

int main() {
    MyPoint p1;
    MyPoint p2;
    msgpack::zone z;  // 对于由多个成员的数据结构,msgpack 会打包成一个array,因此需要变量 zone 来组织动态分配的外部内存。一个 zone 可以保存多个object
    msgpack::object o(p1, z);  // p 被保存早 zone 中, zone 生存周期必须大于 object
    msgpack::object o(p2, z);
    return 0;
}

e.g 2(留意注释):

#include <msgpack.hpp>
#include <iostream>
#include <memory>

int main() {
    {
        auto z = std::make_unique<msgpack::zone>();
        msgpack::object obj(std::tuple<int, bool, double>(42, true, 123.45), *z);

        // oh holds one zone and four msgpack::objects
        msgpack::object_handle oh(obj, std::move(z));

        // convert msgpack::object to JSON
        std::cout << oh.get() << std::endl;
    } // one zone and four msgpack::objects are destructed here
}

方法2 . 根据自定义类型的数据添加模板函数:

see link:
1. 关于adaptor https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_adaptor
2. 使用模板的例子 https://github.com/msgpack/msgpack-c/blob/master/example/cpp03/class_non_intrusive.cpp

关于 object&zone, see wiki: https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object
see wiki: https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_adaptor
see link: https://github.com/msgpack/msgpack-c/issues/429


在 wamp 中,所有的消息都保存在 wamp_message 这个类中,这个类有两个成员变量:msgpack::zonestd::vector<msgpack::object> :

class wamp_message
{
    ...
private:
    msgpack::zone m_zone;
    using message_fields = std::vector<msgpack::object>;
    message_fields m_fields;
};

然后将 wamp_message 通过 tcp/ip 发送出去的过程:

template <class Socket>
void wamp_rawsocket_transport<Socket>::send_message(wamp_message&& message)
{
    auto buffer = std::make_shared<msgpack::sbuffer>();  // std::stringstream 也可以,但是 sbuffer 更快
    msgpack::packer<msgpack::sbuffer> packer(*buffer);  // 创建一个 packer

    // 打包所有的 msgpack::object,内容被复制到 buffer 中
    packer.pack(message.fields());  // fields() 函数 return std::move( m_fields ) 即 std::vector<msgpack::object>

    // Write the length prefix as the message header.
    uint32_t length = htonl(buffer->size());
    boost::asio::write(m_socket, boost::asio::buffer(&length, sizeof(length)));

    // Write actual serialized message.
    boost::asio::write(m_socket, boost::asio::buffer(buffer->data(), buffer->size()));

    if (m_debug_enabled) {
        std::cerr << "TX message (" << buffer->size() << " octets) ..." << std::endl;
        std::cerr << "TX message: " << message << std::endl;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值