https://www.cppfans.org/1410.html
MessagePack(以下简称MsgPack)一个基于二进制高效的对象序列化类库,可用于跨语言通信。它可以像JSON那样,在许多种语言之间交换结构对象;但是它比JSON更快速也更轻巧。支持Python、Ruby、Java、C/C++等众多语言。比Google Protocol Buffers还要快4倍。
代码:
> require ‘msgpack’
> msg = [1,2,3].to_msgpack #=> “\x93\x01\x02\x03”
> MessagePack.unpack(msg) #=> [1,2,3]
以上摘自oschina介绍。
msgpack官方主页:http://msgpack.org/
github主页:https://github.com/msgpack/msgpack
因我只使用C++版本,故只下载了CPP部分,大家请按需下载。
源码安装msgpack
打开终端下载msgpac 4 cpp最新版本0.5.7
wget http://msgpack.org/releases/cpp/msgpack-0.5.7.tar.gz
解压
tar zxvf msgpack-0.5.7.tar.gz
进入解压后的文件夹中进行安装
cd msgpack-0.5.7./configuremakesudo make install
当然了,你也可以使用git和svn直接抓取源代码进行编译,不过需要安装版本控制工具。
自动安装msgpack
apt-get install libmsgpack-dev
(安装过程中会将头文件拷贝到 /usr/local/include/ 库文件拷贝到/usr/local/lib/)
安装好了,我们直接使用用它看看效果。
直接包含msgpack.hpp即可使用。
simple using
#include <msgpack.hpp>#include <vector>#include <string>#include <iostream>int main(){std::vector<std::string> _vecString;_vecString.push_back("Hello");_vecString.push_back("world");// packmsgpack::sbuffer _sbuffer;msgpack::pack(_sbuffer, _vecString);std::cout << _sbuffer.data() << std::endl;// unpackmsgpack::unpacked msg;msgpack::unpack(&msg, _sbuffer.data(), _sbuffer.size());msgpack::object obj = msg.get();std::cout << obj << std::endl;// convertstd::vector<std::string> _vecRString;obj.convert(&_vecRString);// printfor(size_t i = 0; i < _vecRString.size(); ++i){std::cout << _vecRString[i] << std::endl;} return 0;}
结果就不贴了,大家自己运行下便知。
using stream
#include <msgpack.hpp>#include <vector>#include <string>#include <iostream>int main(){// msgpack stream// use msgpack::packer to pack multiple objects.msgpack::sbuffer buffer_;msgpack::packer pack_(&buffer_);pack_.pack(std::string("this is 1st string"));pack_.pack(std::string("this is 2nd string"));pack_.pack(std::string("this is 3th string"));// use msgpack::unpacker to unpack multiple objects.msgpack::unpacker unpack_;unpack_.reserve_buffer(buffer_.size());memcpy(unpack_.buffer(), buffer_.data(), buffer_.size());unpack_.buffer_consumed(buffer_.size());msgpack::unpacked result_;while (unpack_.next(&result_)){std::cout << result_.get() << std::endl;}return 0;}
使用sbuffer stream序列化多个对象。
如何序列化自定义数据结构
msgpack支持序列化/反序列化自定义数据结构,只需要简单的使用MSGPACK_DEFINE宏即可。
##include <msgpack.hpp>#include <vector>#include <string>class my_class{private:std::string my_string;std::vector vec_int;std::vector vec_string;public:MSGPACK_DEFINE(my_string, vec_int, vec_string);};int main(){std::vector<my_class> my_class_vec;// add some datamsgpack::sbuffer buffer;msgpack::pack(buffer, my_class_vec);msgpack::unpacked msg;msgpack::unpack(&msg, buffer.data(), buffer.size());msgpack::object obj = msg.get();std::vector<my_class> my_class_vec_r;obj.convert(&my_class_vec_r);return 0;}
这样我们就可以在网络通讯等地方可以使用msgpack来序列化我们的数据结构,完全可以做到安全高效,并且可以在接收方使用别的语言来处理结构做逻辑。完全是 多种语言-多种语言,现在支持的语言如下:
Ruby Perl Python C/C++ Java PHP JS OC C# Lua Scala D Haskell Erlang Ocaml Smallalk GO LabVIEW
完全够我们使用了,当然了,如果没有你要的语言,建议看源代码模仿一个。
关于性能测试结果可以查看:linux使用msgpack及测试
0 0
- 对象序列化类库MsgPack介绍
- 对象序列化类库MsgPack介绍
- 对象序列化类库MsgPack介绍
- 对象序列化类库MsgPack介绍
- 序列化工具---对象序列化类库MsgPack介绍
- msgpack---序列化
- msgpack 序列还原 TFDParams
- Msgpack序列化
- msgpack
- thrift, Protocol Buffers and MsgPack 的序列化对比
- thrift, Protocol Buffers and MsgPack 的序列化对比
- Redis 数据序列化方法 serialize, msgpack, json, hprose 比较
- Redis 数据序列化方法 serialize, msgpack, json, hprose 比较
- msgpack序列化,反序列化简单演示
- 对象的序列化介绍(1)
- 介绍Java对象序列化使用基础
- C++对象序列化方案介绍
- Kryo、msgpack、protobuf、Hessian、Avro、Thrift等序列化框架比较
- 数据库水平拆分
- /proc/sysrq-trigger文件的强大功能
- onload与ready方法的区别
- nyoj_96 n-1位数
- UML
- 对象序列化类库MsgPack介绍
- oozie 执行examples 报80020端口拒绝访问问题解决汇总
- 关于校园网能上QQ却打不开网页的问题
- myeclipse 10 安装反编译
- Paint方法setXfermode
- 文件管理 - 3
- 自定义继承GridView,MeasureSpec学习
- 自定义菜单功能开发
- js获取值的方式