2011-04-05 59 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

可能会尝试使用数组而不是列表。如果它所持有的元素是可序列化的,则数组是可序列化的。