【发布时间】:2021-12-22 06:33:56
【问题描述】:
我有 2 种类型的 xml 我想 反序列化 成一个对象。 它们的部分结构相似。我尝试使用 OO 多态原则 - 通过使用 virtual + new 组合,以使其尽可能可用,但我仍然不知道该怎么做。 这是一个演示 - 您可以看到不同之处在于 MSGDATA 节点。
类型 1 XML:
<MESSAGE>
<DOCUMENT>
<MSGHDR>
<TIME_STAMP>2020010100:00:00.000</TIME_STAMP>
<MESSAGE_NAME>1</MESSAGE_NAME>
</MSGHDR>
<MSGDATA>
<ITEMSTYPE_1>
<ITEMTYPE_1>
<NAME_OF_TYPE_1>TYPE1_AAAA</NAME_OF_TYPE_1>
</ITEMTYPE_1>
<ITEMTYPE_1>
<NAME_OF_TYPE_1>TYPE1_BBBB</NAME_OF_TYPE_1>
</ITEMTYPE_1>
</ITEMSTYPE_1>
</MSGDATA>
</DOCUMENT>
<DOCUMENT>
<MSGHDR>
<TIME_STAMP>2020010100:00:00.000</TIME_STAMP>
<MESSAGE_NAME>2</MESSAGE_NAME>
</MSGHDR>
<MSGDATA>
<ITEMSTYPE_1>
<ITEMTYPE_1>
<NAME_OF_TYPE_1>TYPE1_EEEEEE</NAME_OF_TYPE_1>
</ITEMTYPE_1>
<ITEMTYPE_1>
<NAME_OF_TYPE_1>TYPE1_FFFFF</NAME_OF_TYPE_1>
</ITEMTYPE_1>
</ITEMSTYPE_1>
</MSGDATA>
</DOCUMENT>
</MESSAGE>
类型 2 XML:
<MESSAGE>
<DOCUMENT>
<MSGHDR>
<TIME_STAMP>2020010100:00:00.000</TIME_STAMP>
<MESSAGE_NAME>1</MESSAGE_NAME>
</MSGHDR>
<MSGDATA>
<ITEMSTYPE_2>
<ITEMTYPE_2>
<NAME_OF_TYPE_2>TYPE2_CCCC</NAME_OF_TYPE_2>
</ITEMTYPE_2>
<ITEMTYPE_2>
<NAME_OF_TYPE_2>TYPE2_DDDD</NAME_OF_TYPE_2>
</ITEMTYPE_2>
</ITEMSTYPE_2>
</MSGDATA>
</DOCUMENT>
</MESSAGE>
这里是数据结构(我只用TYPE1 XML演示)-注意Item_1_Message和基类ItemMessage之间的关系-它们具有相同的属性文档 - 但具有继承关系的不同类型:
/固定/
[XmlRoot("MESSAGE")]
public abstract class ItemMessage
{
[XmlIgnore]
public virtual List<ItemDocument> Documents {get; set; }
}
[XmlRoot("MESSAGE")]
public class Item_1_Message : ItemMessage
{
[XmlElement("DOCUMENT)]
public new List<Type_1_ItemDocument> Documents {get; set; }
}
[XmlRoot(ElementName="MSGHDR")]
public class MsgHeader
{
[XmlElement("TIME_STAMP")]
public string strTimeStamp {get; set;}
[XmlElement("MESSAGE_NAME")]
public string MessageName {get; set;}
}
[XmlRoot("DOCUMENT")]
public abstract class ItemDocument
{
[XmlElement("MSGHDR")]
public MsgHeader {get; set;}
}
/*This is related to TYPE1 XML*/
public class Type_1_ItemDocument : ItemDocument
{
[XmlElement("MSGDATA)]
public Type_1_ItemData itemData {get ; set; }
}
[XmlRoot(ElementName = "MSGDATA")]
public class Type_1_ItemData
{
[XmlElement(ElementName = "ITEMSTYPE_1")]
public ItemsType_1 itemstype1 {get; set;}
}
[XmlRoot(ElementName = "ITEMSTYPE_1")]
public class ItemsType_1
{
[Xmlelement("ITEMTYPE_1")]
public List<Item1> items {get ; set;}
}
[XmlRoot(ElementName = "ITEMTYPE_1")]
public class Item1
{
[XmlElement(ElementName = "NAME_OF_TYPE_1")]
[JsonProperty("Name")]
public string name {get;set;}
}
现在,长话短说,当我试图反序列化它时,如下所示:
XmlSerializer xmls = new XmlSerializer(typeof(Item_1_Message));
var result = xmls.Deserialize(new StringReader(<The XML text>));
我得到一个隐藏基类的异常/
解决方案:在抽象类虚拟属性上 - 我将 XmlAttribute 替换为 [XmlIgnore]
【问题讨论】:
标签: c# oop xml-parsing polymorphism xml-deserialization