1. 程式人生 > >物件序列化類庫MsgPack介紹

物件序列化類庫MsgPack介紹

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介紹。

因我只使用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
./configure
make
sudo 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");

	// 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;
}

結果就不貼了,大家自己執行下便知。

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 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;
}

這樣我們就可以在網路通訊等地方可以使用msgpack來序列化我們的資料結構,完全可以做到安全高效,並且可以在接收方使用別的語言來處理結構做邏輯。完全是 多種語言-多種語言,現在支援的語言如下:

Ruby Perl Python C/C++ Java PHP JS OC C# Lua Scala D Haskell Erlang Ocaml Smallalk GO LabVIEW

完全夠我們使用了,當然了,如果沒有你要的語言,建議看原始碼模仿一個。