序列化必需已知類別的限制
問題描述
假設
假設一資料底層類別Money,它的實作有DollarMoney,NtMoney。
假設有一產生此Money的Factory,可以依照外部的字串決定要產生DollarMoney或是NtMoney。
假設一序列化工具,反序列化需要輸入確實形別
問題
Client已知有一檔案,是由DollarMoney序列化而成。現在要反序列化回來。但是Client並不知道是DollarMoney也不用知道,因為只要操作基底即可。所以要如何反序列化從新得到Money物件。
解法
思路 1
- DollarMoney和NtMoney很明確知道自己的型別,因此若是DollarMoney有提供反序列化的方法,就可以解決這個問題。
- 在Money的方法中,新增反序列化的方法,讓後代實作。這樣Client自然就可以呼叫,而且不用再煩惱Money實際的型別
思路 2
思路1的方式有一個問題,那就是Money是一個抽像類別,所以我們還是要知道要被序列化完成的是那一個實體類別,實體化此物件後,再呼叫它的反序列化方法。所以實際上,還是會有必須先初始化一個特定類別的問題。所以比較好的作法如下:
- 找出產生DollarMoney和NtMoney的地方,將方法寫在Factory中,因為Factory能夠產生正確的型別代表在呼叫Factory時,我們是有足夠的資訊來判斷要產出那一種類別。因此,使用相同的方法,我們可以知道此時要反列化的資料應該要是那一種類別。(總不會在序列化的時候,是某一種類別,結果反序列化時,條件會改變而改用另一種類別)