【问题标题】:Deserialize 2 types of XML using Polymorphism OOP principals使用多态 OOP 原则反序列化 2 种类型的 XML
【发布时间】: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


    【解决方案1】:

    解决方案已在代码中更新:在抽象类虚拟属性上 - 我将 XmlAttribute 替换为 [XmlIgnore]

    【讨论】:

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