2011-04-05 73 views
2

我正在使用C#中的序列化,現在我遇到了一個我似乎無法找到答案的問題。所以我有一個可序列化的類,並將另一個可序列化類的列表作爲屬性。我需要列表中的項目之一具有不同的屬性,所以我創建了一個子類,並像以前一樣將它添加到列表中。那時序列化問題出現了,所以我只能想象列表不能被序列化爲繼承類,但爲什麼?而如何滿足類似的目標呢?無論如何,這是我想要實現的一個例子:使用繼承類型的列表序列化

[Serializable] 
public class aList 
{ 
    [XmlElement]public List<b> list = new List<b>(); 

    public aList() 
    { 
     list.Add(new b()); 
     list.Add(new b()); 
     list.Add(new c()); 
    } 
} 

[Serializable] 
public class b 
{ 
    [XmlElement]public int prop1; 
    [XmlElement]public string prop2; 

    public b() 
    { 
     prop1 = 0; 
     prop2 = String.Empty; 
    } 
} 

[Serializable] 
public class c : b 
{ 
    [XmlElement]public bool prop3; 

    public c() : base() 
    { 
     prop3 = false; 
    } 
} 
+1

注意'Serializable'無關與XML序列化。它僅適用於二進制序列化。 – 2011-04-05 21:28:01

回答

4

XmlInclude屬性。他們有點......很帥氣。基本上,你給你的類提供了一些屬性給串行器提供關於你的繼承的提示。

具體做法是:

[Serializable] 
[XmlInclude(typeof(c))] 
public class b 
{ 
    [XmlElement] 
    public int prop1; 

    [XmlElement] 
    public string prop2; 

    public b() 
    { 
     prop1 = 0; 
     prop2 = String.Empty; 
    } 
} 
+0

根據文檔,此屬性用於與數據契約相關的,這裏不使用。正確? – 2011-04-05 21:24:37

+2

編輯你的答案。 'KnownType'用於'DataContractSerializer',不用於'XmlSerializer'。改爲使用'XmlInclude'。 – 2011-04-05 21:27:26

+0

噢,一直在使用DataContracts這麼多,我忘了其他的:)。感謝您的更正! – 2011-04-05 21:29:44

-2

可能會嘗試使用數組而不是列表。如果它所持有的元素是可序列化的,則數組是可序列化的。