2015-05-09 55 views
0

我知道那裏有很多類似的問題,但仍然經過幾個小時的搜索後,我沒有找到答案。我希望序列化來自Person類的字段的Child對象。這裏是代碼:DataContract序列化(繼承)

[DataContract] 
    abstract class Person 
    { 
     [DataMember] 
     protected int level; 

     [DataMember] 
     protected string name; 

     public Person(int level, string name) 
     { 
      this.level = level; 
      this.name = name; 
     } 
    } 

[DataContract] 
    [KnownType(typeof(Child))] //With and without it\\ 
    class Child : Person 
    { 
     public Child(int level, string name) : base(level , name) {} 
    } 

class Program 
    { 
     static void Main(string[] args) 
     { 
      //CREATE OBJECTS 
      List<Person> p = new List<Person>(); 
      Person p1 = new Child(3, "ned"); p1.Display(); 
      Person p2 = new Child(5, "rob"); p2.Display(); 
      p.Add(p1); p.Add(p2); 

      //SERIALIZER 
      var ser = new DataContractSerializer(typeof(List<Person>)); 

      //WRITE 
      FileStream fs = new FileStream("deep.xml", FileMode.Create); 
      ser.WriteObject(fs, p); 
      fs.Close(); 

      //READ 
      FileStream fs2 = new FileStream("deep.xml", FileMode.Open); 
      List<Person> a = new List<Person>(); 
      a = (List<Person>)ser.ReadObject(fs2); 
     } 
    } 

這裏是我的問題:


註明爲線 「與不爲」 的序列化似乎工作好,但我不能反序列化它,我得到「SerializationException」,而這樣做:

a = (List<Person>)ser.ReadObject(fs2); 

它說,錯誤是在168列是這裏的某個地方:

<Person i:type="Child"> 

沒有那條線我甚至不能序列化。我得到了SerializationException,它說了一些關於意外類型的東西。這個錯誤來自該行:

ser.WriteObject(fs, p); 

有什麼我失蹤?一些解釋說明「有和沒有它」的確切線將會受到歡迎。我試圖找到答案,但微軟網站上的描述不清楚。

我將非常感謝任何幫助。

解決方案: 將[KnownType(typeof(Child))]移動到Person類。在多重繼承的情況下,可以使用多個KnowType屬性。

鏈接到文件:https://msdn.microsoft.com/en-us/library/ms730167%28v=vs.110%29.aspx

回答

0

至於串行而言,它是序列化的類型是Person

序列化時,Person沒有DataContact屬性,所以這是第一個要解決的問題。

[DataContract]  
abstract class Person 

名單將現在序列化,但是當你來到反序列化則發生類似的問題 - 解串器只知道在Person類型。所述documentation的相關部分說:

被實例化反序列化類型是由第一檢查傳入消息以確定該消息的內容符合數據契約選擇的。反序列化引擎然後嘗試查找實現與消息內容兼容的數據契約的CLR類型。在這個過程中,反序列化引擎允許的一組候選類型被稱爲解串器的一組「已知類型。「

因此,這是你的KnownType屬性進來:

[DataContract] 
[KnownType(typeof(Child))] 
abstract class Person 
+0

我的錯誤是我沒有抄這條線,總有是[DataContract]和錯誤仍然apear但是這最後真的。幫助,謝謝 – Bielik

+0

您是否閱讀了我的答案的其餘部分?您在錯誤的類上有'KnownType'屬性 –

+0

是的,我剛剛編輯回覆,起初沒有看到它,我想糾正錯誤代碼asap抱歉你真的幫助了我,再次感謝。如果我只是問,這是我的序列化測試程序,在原始項目中,我有不止一個班級t從Parent繼承。我怎樣才能在那裏工作? – Bielik