深入淺出MFC學習筆記:MFC六大關鍵技術仿真之永續生存

永續生存

MFC中很重要的一個模塊:負責實現資料的讀寫過程,即數據該怎麼去保存到硬盤中和從硬盤中取出來。

參考文獻:深入淺出MFC-侯捷

對象導向有一個術語:Persistence,有了此機制之後,對象就能永續保存。

MFC有一套Serialize機制,目的在於把檔名的選擇,文件的開關,緩衝區的建立,資料的讀寫,萃取運算子(>>)和嵌入運算子(<<)的多載,對象的動態生成包裝起來。這些操作除了資料的讀寫和對象的動態生成(之前已經實現過),其餘都是枝節。

文檔的寫過程,只要把其中的成員變量依次寫進文件即可。我們首先應該記載其類別名稱,然後纔是對象中的資料。

讀檔有點麻煩,當程序從文件中讀到一個類別名稱,需要動態生成技術來生成一個對象。

1..DECLARE_SERIAL和IMPLEMENT_SERIAL宏

由此可以知道SERIAL宏是建立在動態生成的機制基礎上的。

2.Serialble的必要條件


3.例子


要構建上圖所示的資料結構,將這些資料進行存檔。

首先介紹例子所用到的類的類別


3.1.Serialize過程:






3.2.大致的寫檔過程


3.3.詳解Serialize寫檔奧祕:

3.3.1例子中文檔所保存的具體資料如下:(我們關注的是程序怎麼構造出這些數據)




3.3.2具體的寫檔過程如下:


//令file和archive產生關聯,對着archive做序列化動作。CSribbleDoc要求線條串行COblist存儲它自己。


//operator<<操作的作用:分爲兩部分,WriteClass(pClassRef)負責輸出上文所要求的數據中的前面一部分,即區分是否爲新類別的標記,類別的版本號碼,類的名稱大小及類的名稱,至於後面的剩餘數據由((Cobject*)pOb)->Serialize(*this)負責輸出,將這些數據存儲到序列化文件.SCB文件中。等到讀檔的過程需要用到SCB文件。





寫檔總結:程序組織數據,通過arr<<arr.Write等操作將數據寫到序列化文件.SCB文件中。

3.4.詳解Serialize讀檔奧祕:





這邊有DocTemplate負責產生Document,View,DocumentFrame三個對象(均爲動態創建)


//令file和archive產生關聯,對着archive做序列化動作



上圖中的pOb爲動態創建,獲得當前所需類型的對象。



//返回所需Se
rialize的對象的CRuntimeClass,由此便可以動態創建所需要的Serialize對象


//由.SCB文件中讀入類的名稱,從而可以查找類別型錄網來獲得所需類的CruntimeClass數據結構。



讀檔總結:從.SCB文件中讀取數據,讀出類名,就可以通過一一比對類樹開始進行動態生成,對該類進行Serialize操作。

總結:寫檔的過程是把各變量或者對象的數據全部寫到序列化SCB文件中,將其保存到硬盤中;讀檔的時候就可以打開這個SCB文件,將數據讀到各變量或者對象中。


Tip:程序員的工作:改寫用戶自定義對象中的Serialize函數即可。


沒弄明白的問題:爲啥IMPLEMENT_SERIAL需要重載>>操作,而不重載<<操作。書本中的解釋是WriteObject操作不需要CRuntimeClass信息,但是ReadObject操作需要,因爲在讀完文件後還要做動態生成的動作。

疑惑:書中的代碼詳解有關於動態生成的具體過程應該是從SCB文件讀取出所需要的類名,然後通過一一比對,獲取所需要的CRuntimeClass信息,這樣子來理解的話,ReadObject操作爲啥還需要CRuntimeClass信息?

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