文档章节

msgpack使用

pengyouya123
 pengyouya123
发布于 2013/08/12 16:53
字数 516
阅读 6912
收藏 2

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;
}

封装

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)

© 著作权归作者所有

pengyouya123
粉丝 1
博文 2
码字总数 775
作品 0
哈尔滨
私信 提问
加载中

评论(4)

pengyouya123
pengyouya123 博主
确实有这个问题,没考虑周全
勋章坠落的
勋章坠落的
你的代码是错的(第8行,如果data中包含'\0'就<<不完整了), 应该用read和write.
pengyouya123
pengyouya123 博主

引用来自“勋章坠落的”的评论

bug?: http://stackoverflow.com/questions/21018336/why-msgpack-c-do-not-support-vectorfloat-or-vectordouble-in-my-case

很久不用了,好像这个库很久不更新了,你应该说下在那一行出现异常
勋章坠落的
勋章坠落的
bug?: http://stackoverflow.com/questions/21018336/why-msgpack-c-do-not-support-vectorfloat-or-vectordouble-in-my-case
msgpack在java/c和go中序列化的区别-解决

既然已经知道msgpack-java/msgpack-c里,默认情况下把class pack成类似json-array 而msgpack-go,默认情况下把class pack成类似json-map 顺着这个,翻看msgpack-Go的代码,找到了MsgpackHand...

咖啡伴侣
2014/02/27
1K
0
golang -- 序列化 msgpack & json

下面总结一下go的序列化,通信中常用的格式:msgpack和json msgpack 安装: go get go get github.com/vmihailenco/msgpack go install github.com/vmihailenco/msgpack api:http://godoc.org/g......

flyking
2014/01/08
4.2K
1
二进制数据格式MessagePack:比JSON更快更轻巧

MessagePack是一种新的基于二进制的对象序列化类库。它可以像JSON那样,在许多种语言之间交换结构对象(比如移动app项目);但是它比JSON更快速也更轻巧。 MessagePack简称msgpack,官方网站...

基督山伯爵
2013/03/08
5.2K
2
MessagePack 学习笔记

封装和解析类似json的 key-value 示例 {"ID" = 333,"name"="zds","3333"="ende"} msgpack::sbuffer sBuf; msgpack::unpacked unpack; 解析Socket示例 各类数据结构: msgpack::object 他是一个......

狂斩一条龙
2017/09/20
0
0
memleaks starred msgpack/msgpack-erlang

memleaks starred msgpack/msgpack-erlang memleaks's Activity2016-05-0548 阅读 erlang memleaks starred msgpack/msgpack-erlang May 5, 2016 点赞 erlang 作者:memleaks's Activity 原文......

memleaks's Activity
2016/05/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
12
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部