2010-04-29 179 views
0

我不積極我正在以正確的方式進行。我有一套具有不同輸出類型(自定義類型)的應用程序。序列化類型定義?

例如,可能我的Widget稱爲類型:

Class Widget 
     Public name as String 
End Class 

在整個操作過程中,當用戶遇到一定的條件下,應用程序將利用該用戶收到的widget的是輸出實例,序列化它,並將其記錄到數據庫中,記錄該類型的名稱。

現在,我有其他類似的應用程序,但不是處理Widget,它可能是一些完全隨機的具有不同屬性的其他類型,但我再次序列化實例,將其記錄到數據庫,並記下類型的名稱。我可能有六種不同類型,未來不會預計會有太多額外的類型。

說完這一切之後,我有一個管理界面,可以查看這些日誌,並且可以讓用戶查看已記錄的這些數據的內容。 Admin應用程序對所涉及的所有類型都有引用,並且一些基本的開關事例邏輯取決於類型的名稱,將其轉換爲它們的原始類型,並將其傳遞給一些具有基本顯示邏輯的處理程序以吐出數據以可讀格式(每類一個顯示處理器)

現在又回到了......這一切都很好...

直到有一天,我的模型改變。 Widget類現在已棄用了name屬性,並添加了一大堆其他屬性。當我嘗試重新構建這些數據時,我當然會在管理員端獲得類型不匹配。

我想知道是否有某種方法,在運行時,我可以通過我的代碼進行反射,並在該時刻獲取類型定義的快照,序列化並將其與數據一起存儲,以便我可以以某種方式用它來重建它在未來?

回答

1

我不需要這樣做,因爲回到MFC的日子裏,這是一個非常手動的過程,所以在.Net中工作方式不同,但也許這可能是有用的。我們解決這個問題的方式是,當我們序列化任何東西時,我們也寫了一個版本號,並且我們只添加了新的數據位來寫,我們從不刪除或修改任何東西(儘管我們會輸出空數據,所以如果名稱被刪除,我們將它寫爲一個空字符串)。

然後反序列化器會使用大量的if語句,它只會讀取數據的某些部分(如果它超過了版本X,並且讀取了反序列化程序中提到的所有內容),之後它將忽略任何內容。

這樣做的一大優點是數據可以被舊版本和新版本的應用程序讀取,但顯然只有當應用程序可以對缺失的數據使用某些合適的默認值時才能使用,但是如果您只想查看管理工具中的數據,就不應該成爲問題,並且會給您帶來的好處,即每次更改模型時都不需要更新管理工具。

相關問題