介绍

MessagePack(简称msgpack)是一个小巧而高效的序列化/反序列化库,支持多种开发语言。官方网站:http://msgpack.org/

下面是官方的一个简介:

It's like JSON.
but fast and small. MessagePack is an efficient binary serialization format. It lets you exchange data among multiple languages
like JSON. But it's faster and smaller. Small integers are encoded into a single byte, and typical short
strings require only one extra byte in addition to the strings themselves.

msgpack支持非常多的开发语言,这篇随笔只讨论在C++代码中的调用。

序列化键值对数据

一个经常遇到的应用场景是,我们需要序列化一组键值对。这组键值对的大小是可变的,值类型也不确定,例如:

key name  key type value type
type string int
ratio string double
msg string string

示例代码如下:

 /*
* msgpack C++试验:序列化/反序列化大小可变的非标准map.
* Author: 赵子清
* Blog: http://www.cnblogs.com/zzqcn
*
* */ #include <msgpack.hpp>
#include <string>
#include <cstring>
#include <iostream>
using namespace std; int main(int argc, char** argv)
{ msgpack::sbuffer sbuf;
msgpack::packer<msgpack::sbuffer> pker(&sbuf); // 序列化
pker.pack_map();
pker.pack(string("type"));
pker.pack();
pker.pack(string("ratio"));
pker.pack(2.15);
pker.pack(string("msg"));
pker.pack(string("hello world")); // 反序列化
msgpack::unpacked unpack;
msgpack::unpack(&unpack, sbuf.data(), sbuf.size()); // 直接输出结果
msgpack::object obj = unpack.get();
cout << obj << endl; // 访问具体键值对
msgpack::object_kv* pkv;
msgpack::object_kv* pkv_end;
msgpack::object pk, pv;
if(obj.via.map.size > )
{
pkv = obj.via.map.ptr;
pkv_end = obj.via.map.ptr + obj.via.map.size; do
{
pk = pkv->key;
pv = pkv->val; cout << pk << ", " << pv << endl; ++pkv;
}
while (pkv < pkv_end);
} return ;
}

输出结果:

{"type"=>3, "ratio"=>2.15, "msg"=>"hello world"}
"type", 3
"ratio", 2.15
"msg", "hello world"

序列化自定义类型

msgpack已支持了很多的标准类型,但有时我们会自己定义新的类型,这时,我们必须对新类型做某些修改,以使msgpack可以操作它。

另外,如果你的类型中含有低层指针,则还需要进行一些处理,否则,msgpack只会进行浅拷贝,无法序列化指针所指向的内存数据。

假设我们原本的类型如下:

struct Foo
{
int i;
string str;
char* data;
};

那么要让msgpack操作它,应修改为如下结构:

struct Foo
{
int i;
string str;
// 原始指针类型,内部封装了pack_raw和pack_raw_body方法
msgpack::type::raw_ref data; MSGPACK_DEFINE(i, str, data);
};

下面是完整示例代码:

 /*
* msgpack C++试验:序列化/反序列化自定义数据结构.
* Author: 赵子清
* Blog: http://www.cnblogs.com/zzqcn
* */ #include <msgpack.hpp>
#include <string>
#include <cstring>
#include <iostream>
using namespace std; struct Foo
{
int i;
string str;
// 原始指针类型,内部封装了pack_raw和pack_raw_body方法
msgpack::type::raw_ref data; MSGPACK_DEFINE(i, str, data);
}; int main(int argc, char** argv)
{
Foo f;
f.i = ;
f.str = "hello world";
const char* tmp = "msgpack";
f.data.ptr = tmp;
f.data.size = strlen(tmp) + ; msgpack::sbuffer sbuf;
msgpack::pack(sbuf, f); msgpack::unpacked unpack;
msgpack::unpack(&unpack, sbuf.data(), sbuf.size()); msgpack::object obj = unpack.get(); Foo f2;
obj.convert(&f2); cout << f2.i << ", " << f2.str << ", ";
cout << f2.data.ptr << endl; return ;
}

输出结果:

4, hello world, msgpack

序列化库MessagePack应用(C++)的更多相关文章

  1. 快速序列化组件MessagePack介绍

    简介 MessagePack for C#(MessagePack-CSharp)是用于C#的极速MessagePack序列化程序,比MsgPack-Cli快10倍,与其他所有C#序列化程序相比,具有 ...

  2. 序列化 反序列化 MessagePack for C#

    阅读目录 快速序列化组件MessagePack介绍 简介 使用 快速开始 分析器 内置的支持类型 对象序列化 DataContract兼容性 序列化不可变对象(序列化构造器) 序列化回调 Union ...

  3. 一种高效的序列化方式——MessagePack

    最近在弄一些数据分析方面的内容,发现很多时候数据瓶颈在模块之间的数据序列化和反序列化上了,原来项目中用的是Json,找了一圈发现Json.net在Json序列化库中已经是性能的佼佼者了,便准备从序列化 ...

  4. cereal:C++实现的开源序列化库

    闲来无事发现了一个基于C++实现的序列化工具,相比于其他(比如Boost serialization或Google protobuf,恰巧都用过,以后再介绍),使用简单,感觉不错,下面做个摸索. ce ...

  5. C++序列化库的实现

    C++中经常需要用到序列化与反序列化功能,由于C++标准中没有提供此功能,于是就出现了各式各样的序列化库,如boost中的,如谷歌的开源项目,但是很多库都依赖其他库过于严重,导致库变得很庞大.今天来分 ...

  6. 除了cPickle,cjson外还有没有更高效点的序列化库了

    除了cPickle,cjson外还有没有更高效点的序列化库了 http://blog.csdn.net/chen_lovelotus/article/details/7228745 msgpack最快 ...

  7. #华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库

    在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题.Python标准库里面提供了json序列化的工具,我们可以简单的用json.dumps来将一个对象序列化.但是这种序 ...

  8. 性能超四倍的高性能.NET二进制序列化库

    二进制序列化在.NET中有很多使用场景,如我们使用分布式缓存时,通常将缓存对象序列化为二进制数据进行缓存,在ASP.NET中,很多中间件(如认证等)也都是用了二进制序列化. 在.NET中我们通常使用S ...

  9. 新型序列化类库MessagePack,比JSON更快、更小的格式

    MessagePack is an efficient binary serialization format. It lets you exchange data among multiple la ...

随机推荐

  1. Unity5-CacheServer(资源平台切换之缓存服务器)的部署与使用

    不管你是个人还是团队,如果你的资源很多, 而且经常切换平台, 那你试试这个吧~~兼职爽爆了,秒秒钟实现平台间的转换. cache server主要用于资源修改后的自动重新导入功能,保证所见即所得,方便 ...

  2. for(var i=0;i<5;i++){ setTimeout(function() { console.log(i) }, 100);}

    涉及异步.作用域.闭包 1.settimeout是异步执行,100ms后往任务队列里面添加一个任务 2.let不仅将i绑定到for循环块中,事实上它将其重新绑定到循环体的每一次迭代中 3.闭包 set ...

  3. 开始第一个Android应用程序

    Android应用程序建立在应用程序框架之上,所以Android编程就是面向应用程序框架API编程---与编写普通的Java SE没有太大区别,只是增加了一些API. 1.使用eclipse开发第一个 ...

  4. pyspider示例代码二:解析JSON数据

    本系列文章主要记录和讲解pyspider的示例代码,希望能抛砖引玉.pyspider示例代码官方网站是http://demo.pyspider.org/.上面的示例代码太多,无从下手.因此本人找出一下 ...

  5. 如何查看服务器(linux系统)当前的负载信息(转)

    如何查看服务器当前的负载信息http://www.flybaaa.com/help 网吧内突然很卡,这个情况我相信大家都有遇见过,但是通过什么方法来排查是否linux服务器的负载过大导致的这个问题呢? ...

  6. js 右击事件

    $.fn.extend({        "rightclick": function (fn) {            $(this).mousedown(function ( ...

  7. 09 Finding a Motif in DNA

    Problem Given two strings ss and tt, tt is a substring of ss if tt is contained as a contiguous coll ...

  8. 【转】C中的静态存储区和动态存储区

    一.内存基本构成    可编程内存在基本上分为这样的几大部分:静态存储区.堆区和栈区.他们的功能不同,对他们使用方式也就不同.    静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个 ...

  9. medusa爆破路由

    medusa –M http -h 192.168.10.1 -u admin -P /usr/share/wfuzz/ wordlist/fuzzdb/wordlists-user-passwd/p ...

  10. polymer入门例子-已过时

    这个教程挺不错!:http://blog.csdn.net/renfufei/article/details/37040883 过时了,现在的版本已经为1.0了 一:创建APP结构 本教程会使用预先构 ...