這裡使用的std::istringstream和std::ostringstream即是分別從字符串流中恢復數據以及將類對象的數據轉儲到字符串流中。
對於類MyFilter和MyVideo則使用相同的方式,即分別增加一個友元模板函數serialize的實現即可,至於std::list模板類,boost已經幫我們實現了。
這時我們發現,對於每一個定義的類,我們需要做的僅僅是在類內部聲明一個友元模板函數,同時類外部實現這個模板函數即可,對於後期類的成員變量的修改,如增加、刪除或者重命名成員變量,也僅僅是修改一個函數即可。
Boost序列化庫已經足夠完美了,但故事並未結束!
在用於端上開發時,我們發現引用Boost序列化庫遇到了幾個挑戰
端上的編譯資料很少,官方對端上編譯的資料基本沒有,在切換不同的版本進行編譯時經常會遇到各種奇怪的編譯錯誤問題
Boost在不同的C++開發標準之間兼容性不夠好,尤其是使用libc++標準進行編譯連結時遇到的問題較多
Boost增加了端上發行包的體積
Boost每次序列化都會增加序列化庫及版本號等私有頭信息,反序列化時再重新解析,降低了部分場景下的使用性能
基於泛型編程的序列化實現方法
為了解決使用Boost遇到的這些問題,我們覺得有必要重新實現序列化庫,以剝離對Boost的依賴,同時能滿足如下要求
為了兼容現有使用Boost的代碼以及保持當前開發者的習慣,同時使用代碼修改的重構的工作量最小,我們應該保留模板函數serialize,同時對於模板函數內部的實現,為了提高效率也不需要對各成員變量重新打包,即直接使用如下定義