一個(gè)更好的C++序列化/反序列化庫Kapok
1.Kapok的特點(diǎn)
簡單,易用,header-only,只需要引用Kapok.hpp即可;高效,初步測試性和messagepack相當(dāng)。
它是純c++11實(shí)現(xiàn),因此需要支持C++11的編譯器。
2.主要功能
對(duì)對(duì)象進(jìn)行自動(dòng)化的序列化和反序列化,用起來非常簡單,先來看個(gè)序列化/反序列化一個(gè)tuple的例子吧。
- //序列化
- Serializer sr;
- auto tp = std::make_tuple(10, 12, string("test"));
- sr.Serialize(tp, "tuple");
- //反序列化
- DeSerializer dr;
- std::tuple<int, int, string> p;
- dr.Parse(sr.GetString());
- dr.Deserialize(p, "tuple");
看起來是不是很簡單!
再看一個(gè)序列化一個(gè)自定義對(duì)象的例子。
- struct Person
- {
- int age;
- string name;
- string city;
- META(age, name, city)
- };
- Person p = { 18, "bb", "aa" };
- //序列化
- Serializer sr;
- sr.Serialize(p, "Person");
- //反序列化
- DeSerializer dr;
- Person person;
- dr.Parse(sr.GetString());
- dr.Deserialize(person, "Person");
一樣的很簡單,結(jié)構(gòu)這里需要一個(gè)宏定義META,這個(gè)META的作用就是獲取對(duì)象的元信息,有了這個(gè)元信息我們就可以很方便的實(shí)現(xiàn)序列化和反序列化了。
3.應(yīng)用場景
Kapok除了不支持指針之外所有的對(duì)象都支持,支持結(jié)構(gòu)體的無限嵌套(被嵌套的結(jié)構(gòu)體也必須定義META宏)。這里說一下為 什么不支持指針呢,因?yàn)閷?duì)象中有指針的話存在兩個(gè)問題:1.這個(gè)指針如果是動(dòng)態(tài)數(shù)組的話,c++中無法獲取這個(gè)數(shù)組的長度;2.指針還涉及到內(nèi)存管理,我 希望Kapok專注于序列化和/反序列化,暫時(shí)不考慮內(nèi)存管理。
4.結(jié)構(gòu)體必須有一個(gè)宏定義是否具有侵入性?
看起來每個(gè)序列化/反序列化的對(duì)象都要帶一個(gè)宏定義似乎侵入性較強(qiáng),但這種侵入性是完全無害 的,因?yàn)樗皇嵌x了一個(gè)額外的函數(shù)而已,這個(gè)函數(shù)只會(huì)在序列化/反序列化的時(shí)候才會(huì)用到,不會(huì)對(duì)當(dāng)前對(duì)象造成任何影響,還有一點(diǎn)是因?yàn)閏++沒有反射, 必須要通過某種方法來獲取對(duì)象的元信息,縱觀目前所有的序列化方案,只有這種方式是最簡潔的,用戶做最少的事情即可,這也是我選擇這種方式的原因。
5.Kapok是如何實(shí)現(xiàn)序列化/反序列化的
Kapok的***層是用到了rapidjson, 用它來實(shí)現(xiàn)對(duì)基本類型的序列化,對(duì)它做了一個(gè)簡單的封裝以便供上層使用,上面層就是序列化\反序列化實(shí)現(xiàn)層,主要是實(shí)現(xiàn)對(duì)對(duì)象元信息的解析和自動(dòng)化的打包和解包。下面是Kapok序列化的一個(gè)示意圖:
6.Kapok的性能如何
初步測試對(duì)一個(gè)tuple進(jìn)行序列化/反序列化一萬次,發(fā)現(xiàn)Kapok的耗時(shí)和messagepack相當(dāng)。
7.Kapok是否支持多語言
暫時(shí)不支持,先把c++版本做好再說,如果要支持多語言的話,需要用其它語言進(jìn)行重寫,比較麻煩,所以暫時(shí)不考慮支持多語言。