msgpack使用

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 < class T>
void pack(T &t, string &str)
{
     using namespace msgpack;
     sbuffer buff;
     pack(buff, t);
     ostringstream is;
     is << buff.size() << buff.data();
     str = string(is.str());
}
 
template < class T>
T unpack(string &str)
{
     if (str.size() == 0)
         return NULL;
     
     using namespace msgpack;
     unpacked result;
     istringstream ss(str);
     int len;
     string buff;
     ss >> len >> buff;
     // it's possible exception
     unpack(&result, buff.c_str(), len);
 
     object obj = result.get();
     return obj.as<T>();
}

小结

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

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

Msgpack和Protobuf都是高性能的序列化反序列化库,它们都具有良好的性能和可扩展性,但是它们的实现方式和特点略有不同。 1. 编码方式:Msgpack使用了类似于JSON的编码方式,即将数据序列化成二进制流,可以节省传输的带宽和存储空间;而Protobuf使用了二进制编码方式,采用了一些高效的编解码算法,可以提高编解码的速度。 2. 序列化反序列化性能:在序列化反序列化性能方面,Msgpack通常比Protobuf更快,因为它的编解码方式比Protobuf更简单,数据格式更轻量级。但是在实际应用中,Msgpack的性能与数据大小、数据结构复杂度等因素有关,不一定在所有场景下都比Protobuf更快。 3. 跨平台支持:Msgpack支持多种编程语言,可以在不同的操作系统和硬件平台上使用;而Protobuf也支持多种编程语言,但是在某些平台上可能存在兼容性问题。 4. 可扩展性:Msgpack的可扩展性比较好,可以通过向已有的数据结构中添加新的字段来扩展数据结构,而不会影响已有的数据结构和代码;而Protobuf的可扩展性也很好,可以通过向已有的数据结构中添加新的字段来扩展数据结构,但是需要进行版本控制,以确保数据的兼容性。 综上所述,Msgpack和Protobuf都是高性能的序列化反序列化库,可以根据具体的应用场景和需求来选择合适的库。如果需要轻量级、高效的数据交换格式,可以选择Msgpack;如果需要更多的特性和可扩展性,可以选择Protobuf。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值