【发布时间】:2021-12-22 08:17:03
【问题描述】:
试图找出如何最好地为这两种 XML 设计数据结构:
<DOCUMENTS>
<DOCUMENT>
<DOC_NAME>1</DOC_NAME>
<messages>
<message>
<ID>1</ID>
<MessageValue_Type_1>22222</MessageValue_Type_1>
<message>
<message>
<ID>2</ID>
<MessageValue_Type_1>3333</MessageValue_Type_1>
<message>
</messages>
</DOCUMENT>
<DOCUMENT>
<DOC_NAME>3</DOC_NAME>
<messages>
<message>
<ID>1</ID>
<MessageValue_Type_2>AAAAAAA</MessageValue_Type_2>
<message>
<message>
<ID>2</ID>
<MessageValue_Type_2>BBBBB</MessageValue_Type_2>
<message>
</messages>
</DOCUMENT>
<DOCUMENTS>
请注意,除了 2 种 MessageValue_Type_X 之外,它们非常相似。 这是我设计的数据结构,但仍然无法反序列化我需要用非抽象类属性覆盖基类的 messages 属性。 最后我想做:
XmlSerializer xmls = new XmlSerializer(typeOf(Type_1_Document));
var result = xmls.Deserialize(new StringReader(<The XML text>));
这是数据结构:
[XmlRoot("DOCUMENT")]
public abstract class Document
{
[XmlElement("DOC_NAME")]
public string DocName {get; set;}
[XmlIgnore]
public virtual List<GeneralMessage> messages {get; set;}
}
public class Type_1_Document : Document
{
[XmlElement("messages")]
public new List<Message_Type_1> messages {get; set;}
}
public class Type_2_Document : Document
{
[XmlElement("messages")]
public new List<Message_Type_2> messages {get; set;}
}
[XmlRoot("message")]
public abstract class GeneralMessage
{
[XmlElement("ID")]
public int ID {get; set;}
}
[XmlRoot("message")]
public class Message_Type_1 : GeneralMessage
{
[XmlElement("MessageValue_Type_1")]
public int valueType_1 {get; set;}
}
[XmlRoot("message")]
public class Message_Type_2 : GeneralMessage
{
[XmlElement("MessageValue_Type_2")]
public int valueType_2 {get; set;}
}
已解决:我使用了 virtual(抽象)和 new 关键字(在继承类中)的机制,在抽象类虚拟属性中,我用 [XmlIgnore] 替换了 XmlAttribute 我还删除了抽象类上的 [XmlRoot] 属性。
【问题讨论】:
-
您可能需要修复该 xml,因为它无效。另外,
public class Type_1_Document : DOCUMENT- 情况很重要。您没有“文档”类。 -
@Fildor - 感谢 cmets - 我修正了错别字
标签: c# xml oop polymorphism xml-deserialization