【问题标题】:How to deserialize 2 types XMLs using polymorphism如何使用多态性反序列化 2 种类型的 XML
【发布时间】: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] 属性。

【问题讨论】:

标签: c# xml oop polymorphism xml-deserialization


【解决方案1】:

已解决:代码已更新: 我使用了 virtual(抽象)和 new 关键字(在继承类中)的机制,在抽象类虚拟属性中,我用 [XmlIgnore] 替换了 XmlAttribute 我还删除了抽象类上的 [XmlRoot] 属性。

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    相关资源
    最近更新 更多