使用不同的xsi:style反序列化元素

时间:2016-10-24 16:45:03

标签: xml vb.net xml-deserialization

我需要反序列化包含两种不同类型元素的XML文件 例如:

<loop xsi:type="loopDynamicLengthType">
...
<loop xsi:type="loopTerminatedType">
...

在我的源代码中,该类定义为:

<XmlElement("loop")> Public prLoop() As PosResponseLoop

第二个定义为:

<XmlInclude(GetType(loopTerminatedType))> _
Public Class PosResponseLoop

第一个可以用类似的方式和相同的名称来定义,

<XmlInclude(GetType(loopDynamicLengthType))> _
Public Class PosResponseLoop

但是编译器说:

class 'PosResponseLoop' and class 'PosResponseLoop' conflict in namespace 'WindowsApplication1'.

我该如何解决?

1 个答案:

答案 0 :(得分:1)

标准属性xsi:type允许XML元素显式断言其类型。在这种情况下,元素<loop>可以有两种类型,loopDynamicLengthTypeloopTerminatedType。正如here所述,XmlSerializer使用xsi:type信息将XML元素映射到特定的.Net类型。因此,您需要做的是使用单个基类(可能但不一定是抽象的)来表示任何可能的循环类型,其中包含两个子类,每个子类对应两个可能的xsi:type值:

<XmlInclude(GetType(LoopTerminatedType))> _
<XmlInclude(GetType(LoopDynamicLengthType))> _
Public MustInherit Class PosResponseLoop
End Class

<XmlType("loopTerminatedType")> _
Public Class LoopTerminatedType
    Inherits PosResponseLoop
End Class

<XmlType("loopDynamicLengthType")> _
Public Class LoopDynamicLengthType
    Inherits PosResponseLoop
End Class

基类上的<XmlInclude>属性指定可能遇到的可能子类型集。派生类上的<XmlType(String)>属性指定将显示为相应xsi:type属性值的名称。

然后您的包含类型应如下所示:

Public Class RootObject
    <XmlElement("loop")> Public prLoop() As PosResponseLoop 
End Class

示例fiddle