msgpack使用

来源:互联网 发布:淘宝店铺怎么制作头像 编辑:程序博客网 时间:2024/06/05 11:45

http://msgpack.org/


msgpack介绍

msgpack是一个串行化的第三方库,支持多种语言绑定,同类的软件还有boost的Serialization, google的protobuf等。据说msgpack比protobuf快四倍,而Serialization没有比较过。

msgpack使用

  • 类介绍

    • 缓冲区 sbuffer, vrefbuffer, zbuffer。第一个类sbuffer比较常用,即simple buffer,第三个是自动压缩数据的,需要安装zlib库,在这里不做详细介绍,第二个vrefbuffer,即vector reference buffer,没发现有多大意义,故不解释。

      *打包类 packer, 打包一组数据时用,若只打包一个数据只需用pack方法即可。

    • 解包相关类(unpacker, unpacked), unpacked是存放解包结果的类,而unpacker类内部维护着一个缓冲区存放待解包的数据。 unpack_return类,执行unpack操作的结果
  • 实例
//打包一组数据void test1(){    using namespace msgpack;    sbuffer buff1;    packer<sbuffer> pk(&buff1);    pk.pack(1);    pk.pack(2);    pk.pack(3);    // save packed data to file    ofstream of("1.txt");    of << buff1.size() << buff1.data();    of.close();    //-------------------------------    ifstream is("1.txt");    int n;    is >> n;    unpacker upk;    upk.reserve_buffer(n);  //set buffer size    is.read(upk.buffer(), n);   // read data size    upk.buffer_consumed(n);     // set buffer data real size    unpacked result;    while(upk.next(&result))    {        object obj = result.get();        cout << obj.as<int>() << endl;    }    is.close();}
class myclass{public:    myclass() : num(0), str("default"){}    myclass(int n, const string &s) : num(n), str(s){}    int num;    string str;    MSGPACK_DEFINE(num, str);};//打包一个数据void test2(){    using namespace msgpack;    sbuffer sbuf;    myclass m(1,"hello");    pack(sbuf, m);    unpacked result;    unpack(&result, sbuf.data(), sbuf.size());    object obj = result.get();    myclass m2 = obj.as<myclass>();    cout << m2.num << " " << m2.str << endl;}

封装

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
template<classT>
voidpack(T &t, string &str)
{
    usingnamespace msgpack;
    sbuffer buff;
    pack(buff, t);
    ostringstream is;
    is << buff.size() << buff.data();
    str = string(is.str());
}
 
template<classT>
T unpack(string &str)
{
    if(str.size() == 0)
        returnNULL;
     
    usingnamespace msgpack;
    unpacked result;
    istringstream ss(str);
    intlen;
    string buff;
    ss >> len >> buff;
    // it's possible exception
    unpack(&result, buff.c_str(), len);
 
    object obj = result.get();
    returnobj.as<T>();
}

小结

msgpack支持多种语言绑定,非常强大,而且速度也很快。msgpack还有许多其它类没有使用,如pool, zone等,我认为在c++里用处不大,用c可能很有用,我没有仔细考证,只是通过下面的声明得出结论。

static void unpack(unpacked* result,        const char* data, size_t len, size_t* offset = NULL);// obsoleteinline unpack_return unpack(const char* data, size_t len, size_t* off,        zone* z, object* result)

0 0