我需要反序列化包含两种不同类型元素的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'.
我该如何解决?
答案 0 :(得分:1)
标准属性xsi:type
允许XML元素显式断言其类型。在这种情况下,元素<loop>
可以有两种类型,loopDynamicLengthType
和loopTerminatedType
。正如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。