在 vb.net 中反序列化 XML 数组
Deserialize XML array in vb.net
我需要反序列化 VB.NET 中的 XML 文件。
我正在使用标准 XML 库。
我无法写下 vb 代码来定义以下结构:
<myvar>
<var>...</var>
<troublecodes>
<troublecode>
...
</troublecode>
<troublecode>
....
</troublecode>
<statusbyte>
....
</statusbyte>
<statusbyte>
....
</statusbyte>
<statusbyte>
....
</statusbyte>
</troublecodes>
</myvar>
我的定义是:
Public Class MyVar
<XmlElement("var")> Public name As String
<XmlElement("troublecodes")> Public troubleCodes As TroubleCodes
End Class
Public Class TroubleCodes
<XmlArrayItem("troublecode")> Public troubleCode() As TroubleCode
<XmlArrayItem("statusbyte")> Public statusByte() As StatusByte
End Class
Public Class TroubleCode
<XmlElement("one")> Public one As String
<XmlElement("two")> Public two As String
End Class
Public Class StatusByte
<XmlElement("three")> Public threeAs String
<XmlElement("four")> Public four As String
End Class
但反序列化未填充对象。
我该如何定义它们?
反序列化中的问题通常可以通过序列化根类型的示例并将生成的 XML 与所需的 XML 进行比较来诊断。如果我使用您的 MyVar
类型(演示 fiddle)这样做,我会得到以下结果:
<MyVar>
<var>my name</var>
<troublecodes>
<troubleCode>
<troublecode>
<one>one</one>
<two>two</two>
</troublecode>
</troubleCode>
<statusByte>
<statusbyte>
<three>three</three>
<four>four</four>
</statusbyte>
</statusByte>
</troublecodes>
</MyVar>
这有以下问题:
根节点大写不正确。
这可以通过将 <XmlRoot("myvar")>
添加到您的根类型来解决。
多了一层嵌套<troubleCode>
。
默认情况下,XmlSerializer
序列化所有集合,包括具有外部容器元素的数组。要抑制外部容器元素并将集合序列化为元素的平面序列,请将 XmlArrayItem
属性替换为 <XmlElement("troublecode")>
.
还有一层额外的嵌套<statusByte>
。
因此你的类型应该如下:
<XmlRoot("myvar")> _
Public Class MyVar
<XmlElement("var")> Public name As String
<XmlElement("troublecodes")> Public troubleCodes As TroubleCodes
End Class
Public Class TroubleCodes
<XmlElement("troublecode")> Public troubleCode() As TroubleCode
<XmlElement("statusbyte")> Public statusByte() As StatusByte
End Class
Public Class TroubleCode
<XmlElement("one")> Public one As String
<XmlElement("two")> Public two As String
End Class
Public Class StatusByte
<XmlElement("three")> Public three As String
<XmlElement("four")> Public four As String
End Class
已修复fiddle。
我的解决方案是:
Public Class TroubleCodes
<XmlElement("troublecode")> Public troubleCode() As TroubleCode
<XmlElement("statusbyte")> Public statusByte() As StatusByte
End Class
序列化变量我获得了相同的 XML 代码。
我需要反序列化 VB.NET 中的 XML 文件。
我正在使用标准 XML 库。 我无法写下 vb 代码来定义以下结构:
<myvar>
<var>...</var>
<troublecodes>
<troublecode>
...
</troublecode>
<troublecode>
....
</troublecode>
<statusbyte>
....
</statusbyte>
<statusbyte>
....
</statusbyte>
<statusbyte>
....
</statusbyte>
</troublecodes>
</myvar>
我的定义是:
Public Class MyVar
<XmlElement("var")> Public name As String
<XmlElement("troublecodes")> Public troubleCodes As TroubleCodes
End Class
Public Class TroubleCodes
<XmlArrayItem("troublecode")> Public troubleCode() As TroubleCode
<XmlArrayItem("statusbyte")> Public statusByte() As StatusByte
End Class
Public Class TroubleCode
<XmlElement("one")> Public one As String
<XmlElement("two")> Public two As String
End Class
Public Class StatusByte
<XmlElement("three")> Public threeAs String
<XmlElement("four")> Public four As String
End Class
但反序列化未填充对象。
我该如何定义它们?
反序列化中的问题通常可以通过序列化根类型的示例并将生成的 XML 与所需的 XML 进行比较来诊断。如果我使用您的 MyVar
类型(演示 fiddle)这样做,我会得到以下结果:
<MyVar>
<var>my name</var>
<troublecodes>
<troubleCode>
<troublecode>
<one>one</one>
<two>two</two>
</troublecode>
</troubleCode>
<statusByte>
<statusbyte>
<three>three</three>
<four>four</four>
</statusbyte>
</statusByte>
</troublecodes>
</MyVar>
这有以下问题:
根节点大写不正确。
这可以通过将
<XmlRoot("myvar")>
添加到您的根类型来解决。多了一层嵌套
<troubleCode>
。默认情况下,
XmlSerializer
序列化所有集合,包括具有外部容器元素的数组。要抑制外部容器元素并将集合序列化为元素的平面序列,请将XmlArrayItem
属性替换为<XmlElement("troublecode")>
.还有一层额外的嵌套
<statusByte>
。
因此你的类型应该如下:
<XmlRoot("myvar")> _
Public Class MyVar
<XmlElement("var")> Public name As String
<XmlElement("troublecodes")> Public troubleCodes As TroubleCodes
End Class
Public Class TroubleCodes
<XmlElement("troublecode")> Public troubleCode() As TroubleCode
<XmlElement("statusbyte")> Public statusByte() As StatusByte
End Class
Public Class TroubleCode
<XmlElement("one")> Public one As String
<XmlElement("two")> Public two As String
End Class
Public Class StatusByte
<XmlElement("three")> Public three As String
<XmlElement("four")> Public four As String
End Class
已修复fiddle。
我的解决方案是:
Public Class TroubleCodes
<XmlElement("troublecode")> Public troubleCode() As TroubleCode
<XmlElement("statusbyte")> Public statusByte() As StatusByte
End Class
序列化变量我获得了相同的 XML 代码。