msgpack是一個串行化的第三方庫,支持多種語言綁定,同類的軟件還有boost的Serialization, google的protobuf等。聽說msgpack比protobuf快四倍,而Serialization沒有比較過。 c++
類介紹 google
緩衝區 sbuffer, vrefbuffer, zbuffer。第一個類sbuffer比較經常使用,即simple buffer,第三個是自動壓縮數據的,須要安裝zlib庫,在這裏不作詳細介紹,第二個vrefbuffer,即vector reference buffer,沒發現有多大意義,故不解釋。 spa
*打包類 packer, 打包一組數據時用,若只打包一個數據只需用pack方法便可。 code
//打包一組數據 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; }
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可能頗有用,我沒有仔細考證,只是經過下面的聲明得出結論。 get
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)