1. 什麼是序列化?
程序猿在編寫應用程序的時候每每需要將程序的某些數據存儲在內存中,而後將其寫入某個文件或是將它傳輸到網絡中的還有一臺計算機上以實現通信。這個將程序數據轉化成能被存儲並傳輸的格式的過程被稱爲「序列化」(Serialization),而它的逆過程則可被稱爲「反序列化」(Deserialization)。html
簡單來講,序列化就是將對象實例的狀態轉換爲可保持或傳輸的格式的過程。與序列化相對的是反序列化,它依據流重構對象。這兩個過程結合起來,可以輕鬆地存儲和數據傳輸。好比,可以序列化一個對象,而後使用 HTTP 經過 Internet 在client和server之間傳輸該對象。算法
總結網絡
序列化:將對象變成字節流的形式傳出去。數據結構
反序列化:從字節流恢復成原來的對象。
框架
2. 爲何要序列化?優勢在哪裏?
簡單來講,對象序列化通常用於兩個目的:
google
(1) 將對象存儲於硬盤上 ,便於之後反序列化使用
編碼
(2)在網絡上傳送對象的字節序列spa
對象序列化的優勢在哪裏?網絡傳輸方面的便捷性、靈活性就不說了,這裏舉個咱們經常可能發生的需求:你有一個數據結構,裏面存儲的數據是通過很是多其餘數據經過很是複雜的算法生成的,由於數據量很是大,算法又複雜,所以生成該數據結構所用數據的時間可能要很是久(或許幾個小時,甚至幾天),生成該數據結構後又要用做其餘的計算,那麼你在調試階段,每次執行個程序,就光生成數據結構就要花上這麼長的時間,無疑代價是很是大的。假設你肯定生成數據結構的算法不會變或不常變,那麼就可以經過序列化技術生成數據結構數據存儲到磁盤上,下次又一次執行程序時僅僅需要從磁盤上讀取該對象數據就能夠,所花費時間也就讀一個文件的時間,可想而知是多麼的快,節省了咱們的開發時間。
指針
3. C++對象序列化的四種方法
將C++對象進行序列化的方法通常有四種,如下分別介紹:調試
3.1 Google Protocol Buffers(protobuf)
Google Protocol Buffers (GPB)是Google內部使用的數據編碼方式,旨在用來取代XML進行數據交換。可用於數據序列化與反序列化。主要特性有:
- 高效
- 語言中立(Cpp, Java, Python)
- 可擴展
3.2 Boost.Serialization
Boost.Serialization可以建立或重建程序中的等效結構,並保存爲二進制數據、文本數據、XML或者實用戶本身定義的其它文件。該庫具備下面吸引人的特性:
- 代碼可移植(實現僅依賴於ANSI C++)。
- 深度指針保存與恢復。
- 可以序列化STL容器和其它常用模版庫。
- 數據可移植。
- 非入侵性。
3.3 MFC Serialization
Windows平臺下可以使用MFC中的序列化方法。MFC 對 CObject 類中的序列化提供內置支持。所以,所有從 CObject 派生的類均可利用 CObject 的序列化協議。
3.4 .Net Framework
.NET的執行時環境用來支持用戶定義類型的流化的機制。它在此過程當中,先將對象的公共字段和私有字段以及類的名稱(包含類所在的程序集)轉換爲字節流,而後再把字節流寫入數據流。在隨後對對象進行反序列化時,將建立出與原對象全然一樣的副本。
3.5 簡單總結
這幾種序列化方案各有優缺點,各有本身的適用場景。當中MFC和.Net框架的方法適用範圍很是窄,僅僅適用於Windows下,且.Net框架方法還需要.Net的執行環境。參考文獻1從序列化時間、反序列化時間和產生數據文件大小這幾個方面比較了前三種序列化方案,得出結論例如如下(僅供參考):
- Google Protocol Buffers效率較高,但是數據對象必須預先定義,並使用protoc編譯,適合要求效率,贊成本身定義類型的內部場合使用。
- Boost.Serialization 使用靈活簡單,而且支持標準C++容器。
- 相比而言,MFC的效率較低,但是結合MSVS平臺使用最爲方便。
爲了考慮平臺的移植性、適用性和高效性,推薦你們使用Google的protobuf和Boost的序列化方案,如下介紹我使用這兩種方案的心得及注意事項。
本文轉自:最常用的兩種C++序列化方案的使用心得