序列化中CRuntimeClass鍊錶的形成

2021-05-25 00:38:43 字數 1292 閱讀 7062

編寫可序列化類的步驟

1、 直接或間接從cobject派生。 2、

在類宣告中加入declare_serial巨集。 3、

過載基本類的serialize函式,並序列化派生類的資料成員。 4、

如果派生類沒有預設的建構函式,則新增乙個。因為物件載入時,mfc要用預設建構函式在浮動標籤上建立物件,並用從檔案取回的值設定物件資料成員的初始值。 5、

在類的實現中寫入implement_serial巨集。implement_serial巨集接收三個引數:類名、父類名和版本號。

乙個示例:

巨集展開cruntimeclass鍊錶的形成過程。

從上面巨集展開可以看出,序列化比動態建立多了乙個》運算子過載,多填寫了cruntimeclass的m_wschema、m_pclassinit欄位。從cruntimeclass的m_pnextclass欄位可以看出,如果要將所有類的cruntimeclass組成類鍊錶,這個欄位也必須填寫,但在初始化類的cruntimeclass中並沒有填寫這個字段,而是將它置為null。

在序列化中,多了乙個變數_init_cmyclass,也就是它將類的cruntimeclass指標加入到了全域性鍊錶中。

afx_classinit是個結構體,它沒有成員變數,只有乙個包含cruntimeclass指標引數的建構函式。這個構造函式呼叫了afxclassinit()函式,將類的cruntimeclass初始化到了程序類煉表中。  

afxclassinit()函式首先獲得程序模組狀態結構afx_module_state,該結構體中的m_classlist成員變數即為程序類鍊錶。通過呼叫m_classlist.addhead(pnewclass),類的cruntimeclass結構被鏈結了起來。該鍊錶類僅包含支援序列化的類。

m_classlist是ctyped******list型別。呼叫ctyped******list的成員函式addhead(),將新的cruntimeclass指標加入了類鍊錶中。

ctyped******list呼叫了父類的c******list::addhead()。

可以看出乙個最重要的函式c******list::getnextptr(),該函式用來獲得指向下乙個元素的元素指標。也就是說,c******list儲存的結構體元素其中包含乙個字段,用於指向鍊錶中下乙個元素。

m_nnextoffset是c******list的成員變數,它記錄了所儲存的結構體中,指向下乙個元素的元素指標在結構體中的偏移。它是如何被初始化的呢?m_classlist是afx_module_state的成員變數。在afx_module_state的建構函式中,有下面這條語句:

finished...

序列化(序列化)

原書上翻譯為序列化,msdn翻譯為序列化 作用 當需要儲存,或者網路傳輸 remoting時,資料 物件或值 需要序列化 類似於打包傳輸檔案。system.serializableattribute 序列化是指儲存和獲取磁碟檔案 記憶體或其他地方中的物件。在序列化時,所有的例項資料都儲存到儲存介質上...

序列化(模型序列化 序列化巢狀)

from rest framework import serializers from meituan.models import merchant,class merchantserializer serializers.modelserializer class meta model merch...

php中序列化與反序列化

把複雜的資料型別壓縮到乙個字串中 serialize 把變數和它們的值編碼成文字形式 unserialize 恢復原先變數 eg stooges array moe larry curly new serialize stooges print r new echo print r unserial...