[問題] 如何根據System.Type做轉型

作者: s4300026 (s4300026)   2018-09-20 09:43:56
是這樣的
我有寫一個序列化的方法把我的class存檔
BinaryFormatter myBinaryFormatter = new BinaryFormatter();
myBinaryFormatter.Serialize(oFileStream, saveObj);
現在的問題是,我的saveObj會需要與時俱進的新增功能和變數
但每次更新我的class,我的舊的存檔就無法被使用 (因為格式不符)
我目前想到的解決方法是用繼承
像是這樣:主名稱 + 撰寫日期,然後繼承最後一版的class如下
class MyObj180920: object{}
class MyObj180925: MyObj180920{}
class MyObj181001: MyObj180925{}
然後我有個上層class manage
{
Object myObj;
System.Type myObjType;
}
每次我的程式會實體化最新的class和type
myObj = new MyObj180920;
myObjType = (new MyObj180920).GetType();
然後序列化的時候應該(我覺得)會將實作品(MyObj180920)存入硬碟
而非父類別型態(Object)
當我更新版本後(180925)
我期望我的反序列化能根據 myObjType 轉型成正確的過往類別
而不用每次都做轉型判斷
switch (myObj.GetType().Name)
{
case "MyObj180920":
break;
case "MyObj180925":
break;
}
但是我不會用根據System.Type做轉型指令,有人知道要怎麼用嗎?
感謝大家撥冗觀看~
作者: awwseed (MOTO RIDER)   2018-09-20 13:16:00
弄一個 Interface 讓各個 Class 實作?
作者: anumis (阿努米斯)   2018-09-20 16:40:00
有試過json嗎?
作者: s4300026 (s4300026)   2018-09-20 18:55:00
awwseed 我存的是class,所以應該不能用interface吧?anumis json 完全沒聽過耶,或許是第三條路?
作者: testPtt (測試)   2018-09-20 20:54:00
用一個新class包裝IMyObj介面欄位 序列化這個class
作者: s4300026 (s4300026)   2018-09-21 07:33:00
這樣就可以添加新interface欄位了嗎?
作者: testPtt (測試)   2018-09-21 09:07:00
可能不行 沒試過 我只用過明確結構的 會變動的好像不適合不過似乎繼承IExtensibleDataObject可行
作者: sd016808 (sd016808)   2018-09-21 13:26:00
如果只是新增屬性 沒有修改舊的屬性名稱 應該直接用json就可以處理了吧? 甚至也不需要那麼多版本的class 但如果每個版本之間的變化都很大 建議是實作每個版本之間的轉換 根據版本來決定new哪個版本的class 然後在一版一版的轉換到最新版 這樣一定沒問題
作者: totte (totte)   2018-09-21 18:46:00
用reflection
作者: jass970991 (半糖綠假面超人)   2018-09-23 00:28:00
我沒想過這種問題 但如果是我 我會考慮給一個dictionary<某種enum,object> 然後這個object 才是你的class要用的時候再轉 每次更新時直接創新的class 不過這方法也不是很好 我覺得這個難題應該要先想清楚 為什麼這個class會有這麼高頻的變動還不能用generic收納這些變動 我自己是覺得有點怪 不過也可能我就真的剛好沒遇到
作者: s4300026 (s4300026)   2018-09-23 10:27:00
我覺得只要更新難免會多東西吧,要想怎麼處理更新前的存檔
作者: jass970991 (半糖綠假面超人)   2018-09-23 11:12:00
主要是你這樣更新 一開多條branch 開發 merge時就會爆炸了 所以我才會想說到底事需求真的這樣 還是沒考慮清楚
作者: s4300026 (s4300026)   2018-09-23 11:17:00
我承認是我沒有考慮清楚,原本就沒有打算寫給大程式,只想要幾個簡單的功能,沒想到想要的東西越加越多
作者: jass970991 (半糖綠假面超人)   2018-09-23 11:19:00
那你要做的變更的數據形態可以做整合到同一個list或dic裡嗎? 這樣未來會比較好處理如果是會有function增加的問題 建議把單純的資料拉出來做成model 序列化model就好
作者: s4300026 (s4300026)   2018-09-25 11:41:00
我知道了,簡言之,就是存資料,不要存方法,這樣我反而覺得我該走DB,而不是走序列化

Links booklink

Contact Us: admin [ a t ] ucptt.com