日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Boost 序列化 Serialization 底层实现

發布時間:2024/3/26 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Boost 序列化 Serialization 底层实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

0、想寫自己的二進制,不知道從何學起

為了寫一套自己的二進制IO流,我翻了一遍boost的實現;這里講輸出binary部分

省流助手,

1、如果想實現基礎類型的二進制流輸出
? ? ? 去找 basic_binary_oprimitive類里的 save函數的實現 (在binary_orachinve_impl的構造里進行
了一次 os.rebuf() )


2、如果想實現像boost一樣的類的二進制輸出
? ? ??請結合源碼,參悟下面圖類繼承圖里的左側類圖里的實現(又臭又長)

我寫文章的規范不太行,技術不強講的也不是很深入,部分實現需要大家自己跟著源碼去參悟。

首先,主要在網上找到的都是boost二進制的用法 沒有講到具體實現的原理,唯一找到的底層實現就寫了個開頭(不過這個大佬給的圖倒是很方便使用)

圖引用自這里:Boost序列化學習之二——binary_oarchive追本溯源_orsinozhu的專欄-CSDN博客

我自己是對著boost 1.75的版本寫的,

1、首先先從使用講起? :

int temp = 123;//第一種 寫入到文件流fstream ostream("b.dat", ios::out | ios::binary);boost::archive::binary_oarchive oa(ostream);oa& BOOST_SERIALIZATION_NVP(temp);//簡單的寫法是 oa& temp;//第二種 到string 流理stringstream ostream; boost::archive::binary_oarchive oa(ostream);oa& BOOST_SERIALIZATION_NVP(temp);

實際上這里就是給 boost 序列器一個 輸出流oa, 然后把用重載&(本質還是重載了<<)的方式實現數據輸出到oa。這里可以參考Boost - 序列化 (Serialization)_zj510的專欄-CSDN博客?這篇博客里講的 侵入式和非侵入式的自定義類序列化方法。

2、然后我們來講為什么boost的 binary_oarchive 繼承圖

關系為什么會這么深,然后繼承圖都是干嘛用的。

首先我們來看這個繼承圖的左側,如果你看了源碼之后,你會發現看了一圈毫無軟用(當然是有用的),根本沒有講到數據是如何變成二進制的實現,因為這一塊主要實現的是 boost封裝了類、枚舉等的二進制輸出策略(應該是)。

-如果你不想看這段可以直接跳到 第3段

?如果你想深入了解的話,save_override(~)這個函數是這一切的關鍵線索。

?這里開始就逐漸進入了知識盲區,不過不重要,你會發現,無論那一條路,最終都會走線一個函數實現,那就是 ar.save(t) 這個函數,
比如? mpl::identity<detail::save_non_pointer_type<Archive> > 這個類,最終的都會走到ar.save(t)這里只不過每條實現路徑的實現方法不一樣,參數的實現函數也略有不同。

然后這個save(其實就是我們需要的Binary輸出的主要實現函數)

3、繼承圖里另一條繼承樹實現 Binary輸出的實現 save(T& t)

?首先能看的出來 save函數 對一些特殊基礎類還是做了特化的。

然后save函數實際調用的是 save_binary(const void *address, std::size_t count)

?save_binary(~~)里具體實現數據存儲的就是m_sb.sputn(~~)函數了

這里的m_sb其實是 之前boost archive聲明時候的 流對象?

sputn(~~)函數功能請看這里:?streambuf::xsputn - C++ Reference

---------------------------------------------------------------------------------------------------------

?Elem 和 Tr類的聲明 在?binary_oarchive類的構造函數里就聲明好了

?這里的init的函數是個輸出默認 頭文件的實現,也是一個很好的輸出案例文件,

?binary_oarchive_impl 的init里包含了2個init()的實現,
? ? ? ? ?1、一個是輸出版本號和默認信息的?basic_binary_oarchive::init()
? ? ? ? ?2、另一個是輸出 int long float double 占多少字節書的輸出 (輸出都是char 大小的int值),并且還輸出了個 int(1)用來查看當前系統是大段還是小段

4、結果

int temp = 123;
這里是 我? os& temp; 的結果? ?{? 才是int 123 的輸出??

?自此 數據輸出到流的實現其實就看完了。 就能開始寫自己的基礎類實現了。

總結

以上是生活随笔為你收集整理的Boost 序列化 Serialization 底层实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。