http://msgpack.org/
msgpack介绍
msgpack是一个串行化的第三方库,支持多种语言绑定,同类的软件还有boost的Serialization, google的protobuf等。据说msgpack比protobuf快四倍,而Serialization没有比较过。
msgpack使用
类介绍
缓冲区 sbuffer, vrefbuffer, zbuffer。第一个类sbuffer比较常用,即simple buffer,第三个是自动压缩数据的,需要安装zlib库,在这里不做详细介绍,第二个vrefbuffer,即vector reference buffer,没发现有多大意义,故不解释。
*打包类 packer, 打包一组数据时用,若只打包一个数据只需用pack方法即可。
- 解包相关类(unpacker, unpacked), unpacked是存放解包结果的类,而unpacker类内部维护着一个缓冲区存放待解包的数据。 unpack_return类,执行unpack操作的结果
- 实例
//打包一组数据 void test1() { using namespace msgpack; sbuffer buff1; packer<sbuffer> pk(&buff1); pk.pack(1); pk.pack(2); pk.pack(3); // save packed data to file ofstream of("1.txt"); of << buff1.size() << buff1.data(); of.close(); //------------------------------- ifstream is("1.txt"); int n; is >> n; unpacker upk; upk.reserve_buffer(n); //set buffer size is.read(upk.buffer(), n); // read data size upk.buffer_consumed(n); // set buffer data real size unpacked result; while(upk.next(&result)) { object obj = result.get(); cout << obj.as<int>() << endl; } is.close(); }
class myclass { public: myclass() : num(0), str("default"){} myclass(int n, const string &s) : num(n), str(s){} int num; string str; MSGPACK_DEFINE(num, str); }; //打包一个数据 void test2() { using namespace msgpack; sbuffer sbuf; myclass m(1,"hello"); pack(sbuf, m); unpacked result; unpack(&result, sbuf.data(), sbuf.size()); object obj = result.get(); myclass m2 = obj.as<myclass>(); cout << m2.num << " " << m2.str << endl; }
封装
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
|
template
<
class
T>
void
pack(T &t, string &str)
{
using
namespace
msgpack;
sbuffer buff;
pack(buff, t);
ostringstream is;
is << buff.size() << buff.data();
str = string(is.str());
}
template
<
class
T>
T unpack(string &str)
{
if
(str.size() == 0)
return
NULL;
using
namespace
msgpack;
unpacked result;
istringstream ss(str);
int
len;
string buff;
ss >> len >> buff;
// it's possible exception
unpack(&result, buff.c_str(), len);
object obj = result.get();
return
obj.as<T>();
}
|
小结
msgpack支持多种语言绑定,非常强大,而且速度也很快。msgpack还有许多其它类没有使用,如pool, zone等,我认为在c++里用处不大,用c可能很有用,我没有仔细考证,只是通过下面的声明得出结论。
static void unpack(unpacked* result, const char* data, size_t len, size_t* offset = NULL); // obsolete inline unpack_return unpack(const char* data, size_t len, size_t* off, zone* z, object* result)