永續生存
參考文獻:深入淺出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爲動態創建,獲得當前所需類型的對象。
//返回所需Serialize的對象的CRuntimeClass,由此便可以動態創建所需要的Serialize對象
//由.SCB文件中讀入類的名稱,從而可以查找類別型錄網來獲得所需類的CruntimeClass數據結構。
讀檔總結:從.SCB文件中讀取數據,讀出類名,就可以通過一一比對類樹開始進行動態生成,對該類進行Serialize操作。
總結:寫檔的過程是把各變量或者對象的數據全部寫到序列化SCB文件中,將其保存到硬盤中;讀檔的時候就可以打開這個SCB文件,將數據讀到各變量或者對象中。
Tip:程序員的工作:改寫用戶自定義對象中的Serialize函數即可。
沒弄明白的問題:爲啥IMPLEMENT_SERIAL需要重載>>操作,而不重載<<操作。書本中的解釋是WriteObject操作不需要CRuntimeClass信息,但是ReadObject操作需要,因爲在讀完文件後還要做動態生成的動作。
疑惑:書中的代碼詳解有關於動態生成的具體過程應該是從SCB文件讀取出所需要的類名,然後通過一一比對,獲取所需要的CRuntimeClass信息,這樣子來理解的話,ReadObject操作爲啥還需要CRuntimeClass信息?