对象序列化类库MsgPack介绍


MessagePack(以下简称MsgPack)一个基于二进制高效的对象序列化类库,可用于跨语言通信。它可以像JSON那样,在许多种语言之间交换结构对象;但是它比JSON更快速也更轻巧。支持Python、Ruby、Java、C/C++等众多语言。比Google Protocol Buffers还要快4倍。

代码:
> require ‘msgpack’
> msg = [1,2,3].to_msgpack  #=> “\x93\x01\x02\x03″
> MessagePack.unpack(msg)   #=> [1,2,3]

以上摘自oschina介绍。

msgpack官方主页:http://msgpack.org/

github主页:https://github.com/msgpack/msgpack

因我只使用C++版本,故只下载了CPP部分,大家请按需下载。

源码安装msgpack

打开终端下载msgpac 4 cpp最新版本0.5.7

解压

进入解压后的文件夹中进行安装

当然了,你也可以使用git和svn直接抓取源代码进行编译,不过需要安装版本控制工具。

自动安装msgpack

(安装过程中会将头文件拷贝到 /usr/local/include/ 库文件拷贝到/usr/local/lib/)

安装好了,我们直接使用用它看看效果。

直接包含msgpack.hpp即可使用。


simple using

#include <msgpack.hpp>
#include <vector>
#include <string>
#include <iostream>
 
int main()
{
    std::vector _vecString;
    _vecString.push_back("Hello");
    _vecString.push_back("world");
 
    // pack
    msgpack::sbuffer _sbuffer;
    msgpack::pack(_sbuffer, _vecString);
    std::cout << _sbuffer.data() << std::endl;
 
    // unpack
    msgpack::unpacked msg;
    msgpack::unpack(&msg, _sbuffer.data(), _sbuffer.size());
    msgpack::object obj = msg.get();
    std::cout << obj << std::endl;
 
    // convert
    std::vector _vecRString;
    obj.convert(&_vecRString);
 
    // print
    for(size_t i = 0; i < _vecRString.size(); ++i)
    {
        std::cout << _vecRString[i] << std::endl;
    }
 
    return 0;
}
结果就不贴了,大家自己运行下便知。


using stream

#include <msgpack.hpp>
#include <vector>
#include <string>
#include <iostream>
 
int main()
{
    // msgpack stream
 
    // use msgpack::packer to pack multiple objects.
    msgpack::sbuffer buffer_;
    msgpack::packer pack_(&buffer_);
    pack_.pack(std::string("this is 1st string"));
    pack_.pack(std::string("this is 2nd string"));
    pack_.pack(std::string("this is 3th string"));
 
    // use msgpack::unpacker to unpack multiple objects.
    msgpack::unpacker unpack_;
    unpack_.reserve_buffer(buffer_.size());
    memcpy(unpack_.buffer(), buffer_.data(), buffer_.size());
    unpack_.buffer_consumed(buffer_.size());
 
    msgpack::unpacked result_;
    while (unpack_.next(&result_))
    {
        std::cout << result_.get() << std::endl;
    }
 
    return 0;
}
使用sbuffer stream序列化多个对象。


如何序列化自定义数据结构
msgpack支持序列化/反序列化自定义数据结构,只需要简单的使用MSGPACK_DEFINE宏即可。


##include <msgpack.hpp>
#include <vector>
#include <string>
 
class my_class
{
private:
    std::string my_string;
    std::vector vec_int;
    std::vector vec_string;
public:
    MSGPACK_DEFINE(my_string, vec_int, vec_string);
};
 
int main()
{
    std::vector my_class_vec;
 
    // add some data
 
    msgpack::sbuffer buffer;
    msgpack::pack(buffer, my_class_vec);
 
    msgpack::unpacked msg;
    msgpack::unpack(&msg, buffer.data(), buffer.size());
 
    msgpack::object obj = msg.get();
    std::vector my_class_vec_r;
    obj.convert(&my_class_vec_r);
 
    return 0;
}


这样我们就可以在网络通讯等地方可以使用msgpack来序列化我们的数据结构,完全可以做到安全高效,并且可以在接收方使用别的语言来处理结构做逻辑。完全是 多种语言-多种语言,现在支持的语言如下:
Ruby Perl Python C/C++ Java PHP JS OC C# Lua Scala D Haskell Erlang Ocaml Smallalk GO LabVIEW
完全够我们使用了,当然了,如果没有你要的语言,建议看源代码模仿一个。
关于性能测试结果可以查看:linux使用msgpack及测试 

你可能感兴趣的:(对象序列化类库MsgPack介绍)