串行化 msgpack etc.

10 篇文章 0 订阅

当需要将内存中的对象通过网络传输(或者以文件的方式存储)的时候,需要用到序列化。
对于基于网络的远程调(RPC)用来说,通过序列化将自定义对象通过网络传输能极大地简化系统的数据,也很容易实现 corba, wamp等功能。

通过网络传输对象时,可以使用JSON,ProtoBuf 和 MsgPack,下面简要介绍一下msgpack-c的使用:

msgpack example:

#include <msgpack.hpp>
#include <vector>
#include <string>
#include <iostream>

int main(void) 
{
      // serializes this object.
      std::vector<std::string> vec;
      vec.push_back("Hello");
      vec.push_back("MessagePack");

      // serialize it into simple buffer.
      msgpack::sbuffer sbuf;
      msgpack::pack(sbuf, vec);

     // 序列化之后再通过tcp/ip发送出去(wamp原型):
     // boost::asio::write(socket, boost::asio::buffer(sbuf.data(), sbuf.size()));


      // 然后再远端再 deserialize it.
      msgpack::object_handle oh =
          msgpack::unpack(sbuf.data(), sbuf.size());

      // print the deserialized object.
      msgpack::object obj = oh.get();
      std::cout << obj << std::endl;  //=> ["Hello", "MessagePack"]

      // convert it into statically typed object.
      std::vector<std::string> rvec;
      obj.convert(rvec);
}

编译,运行:

$ g++ -Ipath_to_msgpack/include hello.cc -o hello
$ ./hello
["Hello", "MessagePack"]

对于自定义类型,希望通过 msgpack pack&unpack,可以通过如下模板实现(non-intrusive approach):

struct MyClass
{
    int a;
    double int b;
    std::vector<double> c;
}


// used for pack
template <>
struct object_with_zone<MyClass>
{
    void operator()(msgpack::object::with_zone& o, MyClass const& v) const {
        o.type = type::ARRAY;
        o.via.array.size = 3;
        o.via.array.ptr = static_cast<msgpack::object*>(
            o.zone.allocate_align(sizeof(msgpack::object) * o.via.array.size));

        o.via.array.ptr[0] = msgpack::object(v.a, o.zone);
        o.via.array.ptr[1] = msgpack::object(v.b, o.zone);
        o.via.array.ptr[2] = msgpack::object(v.c, o.zone);
    }
};

// used for unpack
template <>
struct convert<MyClass>
{
    msgpack::object const& operator()(msgpack::object const& o, MyClass& v) const
    {
        if (o.type != msgpack::type::ARRAY) throw msgpack::type_error();
        if (o.via.array.size != 3) throw msgpack::type_error();
        v.a = o.via.array.ptr[0].as<int>();
        v.b = o.via.array.ptr[1].as<double>();
        v.c = o.via.array.ptr[2].as<std::vector<double>>();
        return o;
    }
};

reference link:
https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_adaptor
https://github.com/msgpack/msgpack-c/blob/master/example/cpp11/container.cpp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值