2013-07-12 32 views
1

我在數據庫中存儲一個序列化的對象作爲json(或將來可能是xml)。在稍後的時間點,這個物體將被拉動並分解。基類是HighChart,但也有幾種派生類型,如HighChart.ColumnBarChart。圖表的類型存儲在JSON中。問題是我不知道我要如何動態選擇要反序列化的類。DeSerialize到未知派生類型

我的解決方案需要提供一種自動考慮未來派生類型的方法(我將擴展圖表類型的數量,並且不想爲每種圖表類型編寫新的程序)。

我知道我可以將類型存儲到單獨的數據庫字段 - 但我必須在每個類型的Deserialize方法中使用switch語句。我也可以解析json字符串並發現圖表類型,但是我必須爲每種可能的類型使用switch語句。

感謝您的想法!

+0

我不認爲你必須將它反序列化爲具體類型。難道你不能將它反序列化爲基本類型,然後將它用作具體類型(將其轉換爲你需要的地方)? –

+0

@BobHorn我可以很容易地從派生類型轉換爲基類型,但是我不能輕易地從基類型轉換爲派生類型(派生類型通常具有更多的功能,然後是基類型)。關於此主題的其他內容也是這樣的:http:/ /stackoverflow.com/a/124347/1387186 – Wjdavis5

+0

當您轉換爲基本類型時,不會丟失信息。它仍然在那裏。你只是*使用它作爲基礎類型。如果轉換爲派生類型,則可以訪問派生屬性。 –

回答

2

如果存儲新類型的數據庫Assembly Qualified Name,你就可以用它來實例化類型的實例,而不改變類型加載代碼。執行如下所示:

 string assemblyQualifiedName = getAssemblyQualifiedNameFromDatabase(); 

     var futureType = Type.GetType(assemblyQualifiedName); 

     var serializer = new DataContractJsonSerializer(futureType); 

     var result = (HighChart)serializer.ReadObject(stream); 

請注意,沒有case語句:事先不需要知道實際類型。但是,此代碼假定您已將新類型直接包含在項目中或作爲參考。如果要使用尚未用新類型的引用重新編譯的程序集動態加載新類型,則必須加載包含新類型的程序集並使用對加載程序集的引用,以便創建類型引用。

+0

謝謝!這將工作非常好。 – Wjdavis5

2

您提到您無法輕易從基本類型轉換爲派生類型。這是爲什麼?我能夠這樣做。我的狗實體有一個動物基類型中不存在的屬性(DogYears),但我仍然可以將狗反序列化爲動物,然後投射並顯示DogYears。

public class Dog : Animal 
{ 
    public int DogYears { get; set; } // This doesn't exist in the base class 

    public Dog() 
    { 
     this.DogYears = 4; 
    } 
} 

在這裏,我們序列狗的基本類型,然後反序列化作爲基本類型,然而我們仍然可以顯示特定的狗屬性:

private static void JsonSerialization() 
{ 
    Animal dog = new Dog(); 

    var stream = new MemoryStream(); 

    var serializer = new DataContractJsonSerializer(typeof(Animal)); 

    serializer.WriteObject(stream, dog); 

    stream.Position = 0; 

    Animal deserializedDog = serializer.ReadObject(stream) as Animal; 

    Console.WriteLine(((Dog)deserializedDog).DogYears); 
} 

控制檯可以正確顯示「4」 。

爲了完整起見,這裏是動物類:

[KnownType(typeof(Dog))] 
public abstract class Animal 
{ 
    // Properties here 
} 
+0

當我使用.NET 4.5測試此代碼時,我在serializer.WriteObject處得到了「類型不是預期的」異常。 –

+0

這是因爲'Animal'需要'KnownType'屬性。我編輯了我的問題以顯示它。 –