MessagePack(以下簡(jiǎn)稱MsgPack)一個(gè)基于二進(jìn)制高效的對(duì)象序列化類庫(kù),可用于跨語(yǔ)言通信。它可以像JSON那樣,在許多種語(yǔ)言之間交換結(jié)構(gòu)對(duì)象;但是它比JSON更快速也更輕巧。支持Python、Ruby、Java、C/C++等眾多語(yǔ)言。比Google Protocol Buffers還要快4倍。
代碼:
> require ‘msgpack’
> msg = [1,2,3].to_msgpack #=> “\x93\x01\x02\x03″
> MessagePack.unpack(msg) #=> [1,2,3]
以上摘自oschina介紹。
msgpack官方主頁(yè):http://msgpack.org/
github主頁(yè):https://github.com/msgpack/msgpack
因我只使用C++版本,故只下載了CPP部分,大家請(qǐng)按需下載。
源碼安裝msgpack
打開(kāi)終端下載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
進(jìn)入解壓后的文件夾中進(jìn)行安裝
cd msgpack-0.5.7 ./configure make sudo make install
當(dāng)然了,你也可以使用git和svn直接抓取源代碼進(jìn)行編譯,不過(guò)需要安裝版本控制工具。
自動(dòng)安裝msgpack
apt-get install libmsgpack-dev
(安裝過(guò)程中會(huì)將頭文件拷貝到 /usr/local/include/ 庫(kù)文件拷貝到/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"); // pack msgpack::sbuffer _sbuffer; msgpack::pack(_sbuffer, _vecString); std::cout << _sbuffer.data() << std::endl; // unpack msgpack::unpacked msg; msgpack::unpack(&msg, _sbuffer.data(), _sbuffer.size()); msgpack::object obj = msg.get(); std::cout << obj << std::endl; // convert std::vector<std::string> _vecRString; obj.convert(&_vecRString); // print for(size_t i = 0; i < _vecRString.size(); ++i) { std::cout << _vecRString[i] << std::endl; } return 0; }
結(jié)果就不貼了,大家自己運(yùn)行下便知。
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序列化多個(gè)對(duì)象。
如何序列化自定義數(shù)據(jù)結(jié)構(gòu)
msgpack支持序列化/反序列化自定義數(shù)據(jù)結(jié)構(gòu),只需要簡(jiǎn)單的使用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 data msgpack::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; }
這樣我們就可以在網(wǎng)絡(luò)通訊等地方可以使用msgpack來(lái)序列化我們的數(shù)據(jù)結(jié)構(gòu),完全可以做到安全高效,并且可以在接收方使用別的語(yǔ)言來(lái)處理結(jié)構(gòu)做邏輯。完全是 多種語(yǔ)言-多種語(yǔ)言,現(xiàn)在支持的語(yǔ)言如下:
Ruby Perl Python C/C++ Java PHP JS OC C# Lua Scala D Haskell Erlang Ocaml Smallalk GO LabVIEW
完全夠我們使用了,當(dāng)然了,如果沒(méi)有你要的語(yǔ)言,建議看源代碼模仿一個(gè)。
關(guān)于性能測(cè)試結(jié)果可以查看:linux使用msgpack及測(cè)試