介绍

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. axure学习点

    动态模板内部框架动态弹出框

  2. 01-E-1: 迭代与递归

  3. Ruby快速入门

    Rb是什么 ? 交互式Ruby(IRB)为实验提供了一个shell.内置IRB shell,你可以立即一行行查看表达式的结果.该工具自带Ruby安装,所以你必须做一些额外的IRB工作无关.只需键入在命 ...

  4. advance shading——基础(辐射度测定)

    辐射度测定(radiometry) <real time rendering>在这章上来就说了一大堆光照方面的物理术语,不知该怎么翻译.后来在维基百科上看到这个表,清楚了很多(这里的w是瓦 ...

  5. Java Thread系列(九)Master-Worker模式

    Java Thread系列(九)Master-Worker模式 Master-Worker模式是常用的并行设计模式. 一.Master-Worker 模式核心思想 Master-Worker 系统由两 ...

  6. 如何规范移动应用交互设计?UI/UX设计师须知的11个小技巧

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 十年前,手机的使用只是为了沟通. 而近几年,情况发生了很大变化,我们很难找到不使用手机的人.手机在极 ...

  7. centos 7 安装最新版本git

    https://serverfault.com/questions/709433/install-a-newer-version-of-git-on-centos-7 You could use a  ...

  8. android studio使用真机测试时点击Debug调试模式时报Error running app:No target device found,点击运行模式却是启动正常的

    原因是adb没检测到设备(包括真机和虚拟机). 在Terminal执行adb devices命令,查看有没有连接到的设备. 如果没有设备,确认虚拟机是否正确打开,真机是否连接打开USB调试并安装驱动. ...

  9. LVS初步

    LVS初步 一见 目录 目录 1 1. 前言 2 2. 思考 2 3. 名词解释 2 4. OSI参考模型 3 5. LVS架构 4 5.1. 负载均衡器(Load Balancer) 4 5.2.  ...

  10. swift 创建UICollectionView

    // //  CollectionViewController.swift //  tab // //  Created by su on 15/12/8. //  Copyright © 2015年 ...