我一直在进行反序列化并被卡住了。
有我的课程:
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]属性来执行此操作? 我需要{strong>父
中的List<Child>
(Child1或Child2,具体取决于attrute AttribName )
答案 0 :(得分:1)
XmlSerializer
不支持基于属性的鉴别器;只有元素名称。因此,您可以将XmlSerializer
用于此 - 但不是您的方案:
<Parent>
<ChildTypeOne>
</ChildTypeOne>
<ChildTypeTwo>
</ChildTypeTwo>
</Parent>
选项:
答案 1 :(得分:0)
在我的情况下,使用强大的xml格式和非常大的文件,我只有一个解决方案 - 自定义序列化。
答案 2 :(得分:0)
您可以像这样使用自定义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);