轉載自:http://hi.baidu.com/ewook/item/0260f7f3e9082910d6ff8c7f
序列化是將對象狀態資訊轉換為可儲存或傳輸的過程,序列化時,對象會將目前狀態寫入到臨時或持久性的儲存區。以後,可以通過從儲存區中讀取或還原序列化對象的狀態,重新建立該對象。
對象序列化還原序列化通常用於:
1. 將Object Storage Service於硬碟上
2. 在網路上傳送對象的位元組序列
更多介紹
常見的C++序列化方案
==Boost.Serialization==
介紹:Boost.Serialization可以建立或重建程式中的等效結構,並儲存為位元據、文本資料、XML或者有使用者自訂的其他檔案。該庫具有以下迷人的特性:
1. 代碼可移植(實現僅依賴於ANSI C++)
2. 深度指標儲存與恢複
3. 可以序列化STL容器和其他常用模版庫
4. 資料可移植
5. 非入侵性
使用:教程
下載Boost庫,並根據需要編譯(Boost庫涉及較廣)。
編寫應用。
●依需求編寫入侵式或非入侵式序列化方法
●支援STL容器類、指標、父子類的序列化
為需要序列化的類添加序列化代碼。
●初始化fstream
●需求初始化xml, text, binary存檔
●寫入對象,並關閉檔案流
== MFC Serialization ==
簡介:Windows平台下可使用MFC中的序列化方法。MFC 對 CObject 類中的序列化提供內建支援。因此,所有從 CObject 派生的類都可利用 CObject 的序列化協議。(MSDN中的介紹)
使用:
為VS項目添加MFC支援
●設定項目屬性
●包含標頭檔C++:
1 #include <afxwin.h>
2 #include <afxtempl.h>
●編寫繼承CObject的類
●實現序列化方法C++:
1 void Serialize(CArchive& ar);
●添加序列化宏C++:
1 //添加在聲明類中
2 DECLARE_SERIAL(basic_pojo_mfc)
3 //…
4 //添加在實現檔案中
5 IMPLEMENT_SERIAL(MyObject, CObject, 1)
●編寫序列化與還原序列化的對象
●建立CFile,CArchive對象
●寫入對象,關閉資源
==Google Protocol Buffers==
簡介:Google Protocol Buffers (GPB)是Google內部是用的資料編碼方式,旨在用來代替XML進行資料交換。可用於資料序列化與還原序列化。主要特性有:
1. 高效
2. 語言中立(Cpp, Java, Python)
3. 可擴充
官方文檔
使用:
●下載GPB,並編譯出需要使用的庫。
●編寫.proto檔案,並編譯出.cc與.h檔案。
●依規則編寫.proto
●編譯
●Shell/CMD:
1 protoc -I=$SRC_DIR –cpp_out=$DST_DIR $SRC_DIR/addressbook.proto
●編寫序列化與還原序列化代碼。
比較
==測試案例介紹==
比較維度:
●序列化與還原序列化消耗的時間
●產生資料檔案大小
測試資料類型:
C++:01 //基礎資料型別 (Elementary Data Type)
02 class basic_pojo {
03 public :
04 char char8;
05 unsigned char uchar8;
06 short short16;
07 unsigned short ushort16;
08 int int32;
09 unsigned int uint32;
10 long long32;
11 unsigned long ulong32;
12 float float32;
13 double double64;
14 bool bool8;
15 };
16
17 //複合資料型別
18 class complex_pojo {
19 public :
20 string string_stl;
21 basic_pojo_boost basic_class;
22 };
測試代碼
結果
序列化與還原序列化消耗的時間:
產生資料檔案大小:
資料:
Protocol BuffersBoost.SerializationMFC:SerializationSerialization(ms)942191218Unserialization(ms)2032961282Archive Size(KB)459044935372
結論
Google Protocol Buffers效率較高,但是資料對象必須預先定義,並使用protoc編譯,適合要求效率,允許自訂類型的內部場合使用。Boost.Serialization 使用靈活簡單,而且支援標準C++容器。相比而言,MFC的效率較低,但是結合MSVS平台使用最為方便。希望有時間補充更多的序列化方案及測試單位。