介绍

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. ArcGIS GP服务的发布及调用

    参考https://www.jianshu.com/p/5331fa708fe5

  2. 单源最短路:Bellman-Ford算法 及 证明

    描述: 求图中某一点到其他任一点的最短距离. 操作: 1. 初始化 结果保存在一个dist数组里,源点的结果初始化为0,其他初始化为无穷大(如INT32_MAX). 2. 计算: 两重for循环,第一 ...

  3. CentOS错误

    centos下yum lock的解决办法 Another app is currently holding the yum lock; waiting for it to exit... 解决办法:  ...

  4. jQuery的基础dom和css操作

    1.元素以及内容操作 $(function () { // alert($("a").html()); // 获取元素中间的html内容,包括标签和文本内容 // alert($( ...

  5. golang之流程控制(注意点)

    Go在流程控制方面特点如下: 没有do和while循环,只有一个广义的for语句 switch语句灵活多变,还可以用于类型判断 if语句和switch语句都可以包含一条初始化子语句 break语句和c ...

  6. [原创]分享本人自己PY写的BOOST编译程序(源码)

    本程序WINDOWS专用,只做抛砖引玉,希望诸位按照各自需求自行修改,主要目的是为了让诸位编译时可以省一些组合指令的时间,只需要修改几个参数即可自动编译. 支持64位编译模式. 改进版本:http:/ ...

  7. 设置div中的div居中显示

    设置div中的div居中显示 方法一. <div class='big'> <div class='small'>box1</div> </div> s ...

  8. 在MS Test中如何测试private方法

    前言: 在博客开始之前,我们先讨论一下是否应该对private方法做测试,通常有两种观点: private方法应该被测试: private方法不应该被测试: 我们以下面的代码为例子来进行说明: pub ...

  9. [在职软件工程]基于CMMI的软件工程教程

    第1章 软件工程基础 1.1软件工程基本原理 a.按照软件生命周期的阶段划分制定计划,严格依据计划进行管理 项目概要计划,里程碑计划,项目控制计划,产品控制计划,验证计划,运行维护计划 b.坚持进行阶 ...

  10. sed修改json内容

    1.config.json { "whiteHoleUrl": "http://172.16.80.90/whui/serviceManagement/regist/ne ...