[英]Inheritance XML Deserialization by Type Attribute
我有看起來像這樣的XML:
<root>
<base type="a">
<common>1</common>
<concreteA>one</concreteA>
</base>
<base type="b">
<common>2</common>
<concreteB>two</concreteB>
</base>
</root>
和這樣的類:
public class Root
{
public List<Base> Bases { get; set; }
}
public class Base
{
public int Common { get; set; }
}
public class A : Base
{
public string ConcreteA { get; set; }
}
public class B : Base
{
public string ConcreteB { get; set; }
}
如何將其反序列化為對象? 當使用XmlArrayItemAttribute( ElementName, Type )]
每個基本節點都有不同的名稱時,我已經看到很多有關如何執行此操作的文章 ,但是我需要根據elements type
屬性進行選擇。
這是一種非常基本的方法,但是我認為它是有效的。 我認為,如果類類型是元素而不是屬性,那么您應該可以聲明性地解析它。
代碼基本上在type屬性的頂部打開,確定要創建的子類,然后手動填充具體屬性和common屬性。
[System.Xml.Serialization.XmlType("base")]
public class Base
{
[System.Xml.Serialization.XmlElement("common")]
public int Common { get; set; }
}
public class A : Base
{
public string ConcreteA { get; set; }
}
public class B : Base
{
public string ConcreteB { get; set; }
}
[System.Xml.Serialization.XmlRootAttribute("root")]
public class Root : System.Xml.Serialization.IXmlSerializable
{
[System.Xml.Serialization.XmlElement("base")]
public List<Base> Bases { get; set; }
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
this.Bases = new List<Base>();
var document = XDocument.Load(reader);
foreach (var element in document.Root.Elements())
{
Base baseElement = null;
var attr = element.Attribute("type");
if(attr.Value == "a")
{
var a = new A();
a.ConcreteA = element.Element("concreteA").Value;
baseElement = a;
}
else
{
var b = new B();
b.ConcreteB = element.Element("concreteB").Value;
baseElement = b;
}
baseElement.Common = int.Parse(element.Element("common").Value);
this.Bases.Add(baseElement);
}
this.Bases.Dump();
}
public void WriteXml(XmlWriter writer)
{
throw new NotSupportedException();
}
}
void Main()
{
var xmlString = @"<root>
<base type=""a"">
<common>1</common>
<concreteA>one</concreteA>
</base>
<base type=""b"">
<common>2</common>
<concreteB>two</concreteB>
</base>
</root>";
var stream = new StringReader(xmlString);
var deserializer = new System.Xml.Serialization.XmlSerializer(typeof(Root));
var result = (Root)deserializer.Deserialize(stream);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.