程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 一個更好的C++序列化/反序列化庫Kapok,序列化kapok

一個更好的C++序列化/反序列化庫Kapok,序列化kapok

編輯:C++入門知識

一個更好的C++序列化/反序列化庫Kapok,序列化kapok


Kapok FAQ
1.Kapok的特點
簡單,易用,header-only,只需要引用Kapok.hpp即可;高效,初步測試性和messagepack相當。
它是純c++11實現,因此需要支持C++11的編譯器。

2.主要功能
對對象進行自動化的序列化和反序列化,用起來非常簡單,先來看個序列化/反序列化一個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");

看起來是不是很簡單!

再看一個序列化一個自定義對象的例子。

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");
 

一樣的很簡單,結構這裡需要一個宏定義META,這個META的作用就是獲取對象的元信息,有了這個元信息我們就可以很方便的實現序列化和反序列化了。

3.應用場景
Kapok除了不支持指針之外所有的對象都支持,支持結構體的無限嵌套(被嵌套的結構體也必須定義META宏)。這裡說一下為什麼不支持指針呢,因為對象中有指針的話存在兩個問題:1.這個指針如果是動態數組的話,c++中無法獲取這個數組的長度;2.指針還涉及到內存管理,我希望Kapok專注於序列化和/反序列化,暫時不考慮內存管理。

4.結構體必須有一個宏定義是否具有侵入性?
看起來每個序列化/反序列化的對象都要帶一個宏定義似乎侵入性較強,但這種侵入性是完全無害的,因為它只是定義了一個額外的函數而已,這個函數只會在序列化/反序列化的時候才會用到,不會對當前對象造成任何影響,還有一點是因為c++沒有反射,必須要通過某種方法來獲取對象的元信息,縱觀目前所有的序列化方案,只有這種方式是最簡潔的,用戶做最少的事情即可,這也是我選擇這種方式的原因。

5.Kapok是如何實現序列化/反序列化的
Kapok的最底層是用到了rapidjson, 用它來實現對基本類型的序列化,對它做了一個簡單的封裝以便供上層使用,上面層就是序列化\反序列化實現層,主要是實現對對象元信息的解析和自動化的打包和解包。下面是Kapok序列化的一個示意圖:
序列化對象

6.Kapok的性能如何
初步測試對一個tuple進行序列化/反序列化一萬次,發現Kapok的耗時和messagepack相當。

7.Kapok是否支持多語言
暫時不支持,先把c++版本做好再說,如果要支持多語言的話,需要用其它語言進行重寫,比較麻煩,所以暫時不考慮支持多語言。

順便宣傳一下我組織的技術沙龍,歡迎熱愛c++的朋友報名參加,報名地址點這裡。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved