msgpack使用

msgpack介紹

msgpack是一個串行化的第三方庫,支持多種語言綁定,同類的軟件還有boost的Serialization, google的protobuf等。聽說msgpack比protobuf快四倍,而Serialization沒有比較過。 c++

msgpack使用

  • 類介紹 google

    • 緩衝區 sbuffer, vrefbuffer, zbuffer。第一個類sbuffer比較經常使用,即simple buffer,第三個是自動壓縮數據的,須要安裝zlib庫,在這裏不作詳細介紹,第二個vrefbuffer,即vector reference buffer,沒發現有多大意義,故不解釋。 spa

      *打包類 packer, 打包一組數據時用,若只打包一個數據只需用pack方法便可。 code

    • 解包相關類(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;
}

封裝

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)
相關文章
相關標籤/搜索