反序列化有额外的属性与XmlSerializer的

问题描述:

我想反序列化下面的XML列表...反序列化有额外的属性与XmlSerializer的

<MyType> 
    <Items> 
     <ItemSum> 
      <Value>3</Value> 
     </ItemSum> 
     <Item> 
      <Value>1</Value> 
     </Item> 
     <Item> 
      <Value>2</Value> 
     </Item> 
    </Items> 
</MyType> 

...为以下类型的结构......

[XmlRoot("MyType")] 
public class MyType 
{ 
    [XmlArray("Items")] 
    [XmlArrayItem("Item")] 
    public CItems Items { get; set; } 

    public class CItems : List<CItem> 
    { 
     [XmlElement("ItemSum")] 
     public CItem ItemSum { get; set; } 
    } 

    public class CItem 
    { 
     [XmlElement("Value")] 
     public int Value { get; set; } 
    } 
} 

但是,如果我试着用C#的XmlSerializerItemSum属性总是null。任何想法我做错了什么?

+0

你为什么上课'CItem'和'CItems'内部类'MyType'? – 2013-02-15 15:16:23

+0

@RuiJarimba:没什么特别的理由。无论如何他们放在哪里都没有区别。 – 2013-02-15 15:25:04

+0

规范中有些错误。你想获得什么? XML看起来不对,我认为在元素中你应该只有元素。 应该在以外吗? – misha 2013-02-15 15:26:32

这就是:

public class MyType 
{ 
    [XmlArray("Items")] 
    [XmlArrayItem("ItemSum", typeof(ItemSum))] 
    [XmlArrayItem("Item", typeof(SimpleItem))] 
    public CItems Items { get; set; } 

    public class CItems : List<Item> {} 

    public class ItemSum : Item {} 

    public class SimpleItem : Item {} 

    public class Item 
    { 
     public int Value { get; set; } 
    } 
} 

这样的ItemSum是列表中的一个元素,你就可以知道这是它通过检查其类型。

编辑:您还可以利用计算性能:

public class CItems : List<Item> 
{ 
    [XmlIgnore] 
    public ItemSum ItemSum 
    { 
     get { return this.OfType<ItemSum>().Single(); } 
    } 

    [XmlIgnore] 
    public IEnumerable<SimpleItem> SimpleItems 
    { 
     get { return this.OfType<SimpleItem>(); } 
    } 
} 
+0

良好的解决方法。但我宁愿将ItemSum作为一个单独的属性。如果没有更好的答案弹出,我会将你的标记标记为已接受。 – 2013-02-15 16:01:36

+0

我改变了你的答案有点更通用的解决方案。感谢与计算属性的提示! – 2013-02-18 16:36:22