反序列化有额外的属性与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#的XmlSerializer
,ItemSum
属性总是null
。任何想法我做错了什么?
答
这就是:
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
你为什么上课'CItem'和'CItems'内部类'MyType'? – 2013-02-15 15:16:23
@RuiJarimba:没什么特别的理由。无论如何他们放在哪里都没有区别。 – 2013-02-15 15:25:04
规范中有些错误。你想获得什么? XML看起来不对,我认为在元素中你应该只有- 元素。
应该在以外吗? –
misha
2013-02-15 15:26:32