【原創】 Boost序列化了解設計思想

 

在計算機科學的數據存儲中,序列化是將數據結構或對象狀態轉換爲,可以被存儲(例如,在文件或者內存中)或者被傳遞(例如,網絡通訊)的格式,並且後續能被重新轉換構建(可能在不同的計算器環境)。——摘自(翻譯)維基百科

 

文章概要

 

    本文參考Boost序列化官方文檔,主要內容包括Boost序列化的背景、目標、設計思想和疑難問題,瞭解Boost序列化的設計思想。

Boost序列化的背景

 

    Boost序列化的官方文檔,最近的更新時間大概在2009年,主要的寫作時間是2002年至2004年。官方文檔主要包括使用教程、實現參考手冊和案例分析等,內容比較寬泛,講述了Boost序列化從無到有的過程以及碰到的一些疑難問題。

圖1-1 官網首頁圖片

Boost序列化的目標

 

    Boost序列化是爲了解決C++語言的序列化問題。具體來說,就是支持C++所有數據結構的序列化,例如基礎數據類型,指針(包括共享指針)、STL容器、數組、繼承(包括虛繼承和菱形繼承)等。目前支持的序列化協議有,二進制、文本和XML格式。

Boost序列化的設計思想

 

Boost序列化中的兩個重要概念,serialization,表示一組任意的C++數據結構可以和一串字節序相互解構(deconstruction);archive,指代字節流一種特定呈現。serialization完成特定數據結構序列化和反序列化的通用算法工作;archive完成特定協議的相互轉換工作。這爲Boost序列化支持更多的序列化協議提供了可擴展性。

    考慮到現有軟件項目如何使用Boost序列化,採用了入侵性和非入侵性的兩種接入方式。入侵性的方式,使用方需要將CAccess類作爲待序列化類的友元類;非入侵性的方式,使用方將待序列化類的成員變量設爲公有。

    Boost序列化屬於面向I/0流的設計方式,"<<"作爲序列化的運算符,">>"作爲反序列化的運算符;能夠很方便地支持文件的序列化和反序列化(存檔和讀檔),源碼實現中繼承了C++標準庫中的std::istream和std::ostream類。

    Boost序列化的可擴展性,可以從boost\archive\text_oarchive.hpp文件中boost::archive::text_oarchive類(文本協議序列化類)的繼承關係來分析(圖1-2)。在圖1-2中detail::common_oarchive<Archive>以上的類做爲整個序列化的抽象模型,以下的類做爲特定協議的序列化實現,Boost序列化中的二進制、文本和XML協議都是採用這種方式實現的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

圖1-2 boost::archive::text_oarchive類的繼承關係

Boost序列化的問題

 

由於C++語言的複雜性,官方文檔也提到一些語言特性還存在疑難問題尚未解決:

1、右值不能被序列化。對於未跟蹤的類型,可以實現這一點,但是這還沒有完成;

2、指向指針的指針目前不能被序列化;

3、std::map在實現序列化時的一個細微錯誤已經修復。不幸的是,在不支持模板偏特化的編譯器上,這個修復破壞了std::map的序列化;而且,包括指針或跟蹤類型可能也無法正常工作;

4、虛基類的序列化依賴RTTI,在不支持RTTI的系統上是無法序列化的;

5、除此之外,還有一些特定編譯器/庫的問題。

參考文獻

 

[1] Boost序列化官網,https://www.boost.org/doc/libs/1_68_0/libs/serialization/doc/index.html

[2] Boost 1.67.0源代碼,https://www.boost.org/users/history/version_1_67_0.html

[3] 維基百科,https://en.wikipedia.org/wiki/Serialization

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章