对象序列化类库MsgPack介绍
2012-11-26 21:24
1211 查看
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
C++
wget http://msgpack.org/releases/cpp/msgpack-0.5.7.tar.gz
解压
C++
tar zxvf msgpack-0.5.7.tar.gz
进入解压后的文件夹中进行安装
C++
cd msgpack-0.5.7
./configure
make
sudo make install
当然了,你也可以使用git和svn直接抓取源代码进行编译,不过需要安装版本控制工具。
自动安装msgpack
C++
apt-get install libmsgpack-dev
(安装过程中会将头文件拷贝到 /usr/local/include/ 库文件拷贝到/usr/local/lib/)
安装好了,我们直接使用用它看看效果。
直接包含msgpack.hpp即可使用。
simple using
C++
#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
C++
#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宏即可。
C++
##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
完全够我们使用了,当然了,如果没有你要的语言,建议看源代码模仿一个。
关于性能测试结果可以查看:linux使用msgpack及测试
代码:
> 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
C++
wget http://msgpack.org/releases/cpp/msgpack-0.5.7.tar.gz
1 | wget http://msgpack.org/releases/cpp/msgpack-0.5.7.tar.gz |
C++
tar zxvf msgpack-0.5.7.tar.gz
1 | tar zxvf msgpack-0.5.7.tar.gz |
C++
cd msgpack-0.5.7
./configure
make
sudo make install
1 2 3 4 | cd msgpack-0.5.7 ./configure make sudo make install |
自动安装msgpack
C++
apt-get install libmsgpack-dev
1 | apt-get install libmsgpack-dev |
安装好了,我们直接使用用它看看效果。
直接包含msgpack.hpp即可使用。
simple using
C++
#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);
for(size_t i = 0; i < _vecRString.size(); ++i)
{
std::cout << _vecRString[i] << std::endl;
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #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); for(size_t i = 0; i < _vecRString.size(); ++i) { std::cout << _vecRString[i] << std::endl; } return 0; } |
using stream
C++
#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;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #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; } |
如何序列化自定义数据结构
msgpack支持序列化/反序列化自定义数据结构,只需要简单的使用MSGPACK_DEFINE宏即可。
C++
##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;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | ##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; } |
Ruby Perl Python C/C++ Java PHP JS OC C# Lua Scala D Haskell Erlang Ocaml Smallalk GO LabVIEW
完全够我们使用了,当然了,如果没有你要的语言,建议看源代码模仿一个。
关于性能测试结果可以查看:linux使用msgpack及测试
相关文章推荐
- 序列化工具---对象序列化类库MsgPack介绍
- 对象序列化类库MsgPack介绍
- 对象序列化类库MsgPack介绍
- 对象序列化类库MsgPack介绍
- 对象序列化类库MsgPack介绍
- Python pickle类库介绍(对象序列化和反序列化)
- Python pickle类库介绍(对象序列化和反序列化)
- JSON解析类库之Gson(6) --- 从指定的流中读取Json,并反序列化为指定类的对象
- NetworkComms框架介绍 序列化并发送对象
- Java 对象序列化 NIO NIO2详细介绍及解析
- JavaScript中的对象序列化介绍
- 介绍一个款可以在javascript对象上实现观察者模式的类库-Watch.js
- 在C++中如何使用msgpack进行对象的序列化
- java 对象的序列化和反序列化详细介绍
- (转)java编程对象序列化的介绍
- JavaScript中的对象序列化介绍
- 介绍Java对象序列化使用基础
- Msgpack序列化及反序列化对象
- C++对象序列化方案介绍
- 反垃圾云服务技术和基于二进制高效的对象序列化类库 - MessagePack