C#。反序列化到相同的类型取决于属性
问题描述:
我一直在反序列化,并得到stucked。C#。反序列化到相同的类型取决于属性
有我的课:
public class Parent
{
public List<Child> child {get;set}
}
public class Child
{
some properties
}
public class Child1 : Child
{
some properties
}
public class Child2 : Child
{
some properties
}
而且我有XML:
<Parent>
<Child AttribName="TypeOne">
</Child>
<Child AttribName="TypeTwo">
</Child>
</Parent>
如何使用一些[XML]属性做到这一点? 我需要List<Child>
(Child1或CHILD2,取决于attrute ATTRIBNAME)在父
答
可以使用自定义XML阅读器这样的:
public class CustomXmlReader : XmlTextReader
{
public CustomXmlReader(string url) : base(url) { }
public override string GetAttribute(string localName, string namespaceURI)
{
if (namespaceURI == "http://www.w3.org/2001/XMLSchema-instance" && localName == "type")
{
if (base.LocalName == "Child")
{
var attr = base.GetAttribute("AttribName");
if (attr == "TypeOne")
return "Child1";
if (attr == "TypeTwo")
return "Child2";
}
}
return base.GetAttribute(localName, namespaceURI);
}
}
属性添加到基本类:
[XmlInclude(typeof(Child1))]
[XmlInclude(typeof(Child2))]
public class Child
用法示例:
var xs = new XmlSerializer(typeof(Parent));
Parent parent;
using (var xmlReader = new CustomXmlReader("test.xml"))
parent = (Parent)xs.Deserialize(xmlReader);
+0
太棒了!有用 – snowil
答
XmlSerializer
不支持基于属性鉴别器;只有元素名称。所以,你可以使用XmlSerializer
为这个 - 但不是你的场景:
<Parent>
<ChildTypeOne>
</ChildTypeOne>
<ChildTypeTwo>
</ChildTypeTwo>
</Parent>
选项:
- 反序列化手动
- 反序列化之前转换XML
- 简单地改变XML格式
+0
我有很强大的xml结构。序列化之前的转换将是非常繁重的操作。似乎我需要编写自定义序列化。谢谢 – snowil
答
在我的情况下,强xm l格式和非常大的文件我只有一个解决方案 - 自定义序列化。
是出现在这所需要的XML格式?还是你有灵活性来决定它应该是什么样子? – JuanR
作为一个方面说明:*原因*,这不是一个支持的方案的一部分是* xsd *不支持此 –
- Xml需要此格式 – snowil