在 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 代码。