以前以為序列化和rtti沒什麼關系,其實關系密切。
先說序列化,序列化是將對象轉化成字節流數據,以便進行數據傳輸和存儲,最簡單的直接的說法就是‘存盤’,玩個單機游戲,玩著玩著存個盤,游戲裡的主角,npc,地圖各種游戲元素,以某種方式存儲到文件中,只不過單說序列化不講介質,從對象變成二進制數據流,就是序列化。序列化的目的是為了,在將來某個時刻反序列化,從字節流數據轉化成對象,繼續之前的某個軟件應用。
rtti大致是說,在運行時識別動態類型信息,沒有rtti,反序列化的過程大致像這樣:
拿到一段字節數據
=>
分析某個公共頭標識
=>
if identity == 1 then
obja = new ClassA
obja.load(剩下的部分)
else if identity == 2 then
objb = new ClassB
objb.load(...)
...
end
會有一堆的if else,或者switch case,同時還有各種類的new,或者其它什麼。
設計一個公共基類,也改變不了上面這些局面。當然公共基類對於一個全面面向對應的應用是很必須的,除非你說服自己不要用面向對象。
有了rtti,就可以做很cool的事情,反序列化其實可以做成這樣:
拿到一段字節數據
=>
直接生成一個基類對象指針
=>
丟給系統對象管理器
=>
用rtti識別動態類型丟給各自的管理器或者直接參與邏輯
MFC裡有一個局限的實現,具體參見相關文檔,我說的局限是指,我不想用MFC的CObject基類如何指定自己的基類,我如何指定自己的內存分配器,我如何定制自己的存盤格式。
aspx">