介绍

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

最新文章

  1. ELF Format 笔记(十二)—— 段类型(segment types)
  2. VC界面最前端显示
  3. Android开发--ListView的应用
  4. POJ 2367 (裸拓扑排序)
  5. SpringMVC 架构
  6. logback打印不出日志
  7. MongoDB与php的配合使用 【windows版】
  8. VB.NET Shared(共享)和 Static(静态)关键字的区别
  9. JSON 理解
  10. Oracle 报错ORA-00904:标示符无效
  11. 流程控制之if判断
  12. jquery各版本
  13. docker 启动MySQL
  14. Docker入门基础(一)
  15. c# 二进制序列化
  16. jar中META-INF
  17. php排序算法及二分法查找
  18. mrtg 和 rrdtools
  19. 【commons】Bean工具类——commons-beanutils之BeanUtils
  20. January 24 2017 Week 4 Tuesday

热门文章

  1. rundeck
  2. python常用option
  3. 30-python3 中 bytes 和 string 之间的互相转换
  4. java高级工程师(一)
  5. JAVA-用HttpClient来模拟浏览器GET,POST
  6. py学习之FTP
  7. windows安装mysql-5.7压缩版详细教程
  8. 一篇很好的关于mysqld_safe脚本源码解读的文章,收藏了!!
  9. FasterRCNN目标检测实践纪实
  10. 从iOS 11看怎样设计APP图标