You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重命名类而不破坏XmlSerializer的反序列化功能?

解决XML反序列化时重命名类导致数组为空的问题

我完全明白你遇到的困扰——把kostenvoranschlag类重命名后,反序列化出来的kostenvoranschlaege数组直接空了,之前试的XmlElement特性也没起作用。问题出在特性的使用位置和类型不对,咱们直接来修正:

问题根源

XmlSerializer默认会用类名去匹配XML里的元素名称。当你把类改成kostenvoranschlagVersion1后,它会去XML里找<kostenvoranschlagVersion1>节点,但你的XML里还是<kostenvoranschlag>,自然匹配不到,数组就成空的了。

正确解决方案

你需要在xmlinterface类的数组属性上添加XmlArrayItem特性,明确指定数组元素对应XML里的<kostenvoranschlag>节点,同时保留XmlArray特性对应父节点<kostenvoranschlaege>。这样不管类叫什么名字,序列化器都能正确映射。

修正后的完整代码

Imports System.IO
Imports System.Text
Imports System.Xml.Serialization

Public Class Form1
    '<xmlinterface><kostenvoranschlaege><kostenvoranschlag><kvID>1227086</kvID><kvRefID></kvRefID><intKvID></intKvID><status>5</status></kostenvoranschlag><kostenvoranschlag>
    ' 重命名后的目标类
    Public Class kostenvoranschlagVersion1
        Public Property kvID As Integer
        Public Property kvRefID As String
        Public Property intKvID As String
        Public Property status As Integer
    End Class

    <XmlRoot("xmlinterface")>
    Public Class xmlinterface
        <XmlArray("kostenvoranschlaege")>
        ' 核心修正:用XmlArrayItem指定XML中的元素名称
        <XmlArrayItem("kostenvoranschlag")>
        Public kostenvoranschlaege() As kostenvoranschlagVersion1
    End Class

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim sXML As String
        sXML = getTheXMLString() ' 假设该方法能正确返回你的XML内容
        Dim serializer As New XmlSerializer(GetType(xmlinterface))
        Dim xmlstream = New MemoryStream(Encoding.UTF8.GetBytes(sXML))
        xmlstream.Position = 0
        Dim nKVs As xmlinterface = serializer.Deserialize(xmlstream)
        
        ' 现在nKVs.kostenvoranschlaege应该能正确加载所有元素了
        For Each k As kostenvoranschlagVersion1 In nKVs.kostenvoranschlaege
            If k.status = 2 Then
                Stop
            End If
        Next
        Dim breakpointhere = 1
    End Sub
End Class

关键特性说明

  • XmlArray("kostenvoranschlaege"):告诉序列化器这个数组属性对应XML中的<kostenvoranschlaege>父容器节点。
  • XmlArrayItem("kostenvoranschlag"):明确数组里的每个元素对应XML中的<kostenvoranschlag>子节点,和类名彻底解绑,不管你把类改成什么名字都能正常映射。

这样修改后,再运行程序,nKVs.kostenvoranschlaege的计数就会恢复到预期的16个,反序列化就能正常工作了。

内容的提问来源于stack exchange,提问作者tmighty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 12:47:29