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

VB.NET 序列化自定义类写入XML仅生成声明头、内容为空问题

问题核心原因
  • 你定义的Character类仅包含嵌套类的结构声明,没有任何属于Character类本身的公共实例成员,序列化目标对象没有可被识别的内容
  • XmlSerializer默认仅序列化公共实例成员,所有标记为Shared的静态成员会被直接忽略,因此即使你给Shared成员填充了数据也不会被写入XML
  • 你给嵌套类内部的字段加XmlElement特性是无效的,因为序列化遍历的是父类的成员,不是嵌套类的定义
修正后的代码实现

1. 重构Character类结构

Public Class Character
    ' 直接声明实例属性,不再用嵌套类+Shared成员
    <XmlElement("CoreList")>
    Public Property ListCore As CoreStats

    <XmlElement("PowerList")>
    Public Property ListPowers As List(Of Power)

    <XmlElement("EdgesList")>
    Public Property ListEdges As Edges

    <XmlElement("WeaponList")>
    Public Property ListWeps As List(Of Weapon)

    <XmlElement("ArmorList")>
    Public Property ListArm As List(Of Armor)

    <XmlElement("VehicleList")>
    Public Property ListVeh As List(Of Vehicle)

    ' 构造函数里初始化集合,避免空引用
    Public Sub New()
        ListPowers = New List(Of Power)()
        ListWeps = New List(Of Weapon)()
        ListArm = New List(Of Armor)()
        ListVeh = New List(Of Vehicle)()
    End Sub
End Class

你现有的Power类结构不需要修改,本身是正常的实例类,符合序列化要求。

2. 全局变量定义(保留全局访问逻辑)

Public Class GVar
    ' 保留Shared属性,Character内部成员为实例属性
    Public Shared Property CharacterFile As New Character()
End Class

3. 修正序列化代码

推荐用Using语法自动释放资源,避免文件句柄泄漏:

' 先填充测试数据,确保序列化前属性有值
GVar.CharacterFile.ListPowers.Add(New Power() With {
    .Name = "火焰冲击",
    .PRating = 3,
    .Action = "标准动作",
    .Cost = 2,
    .Desc = "对目标造成火焰伤害"
})

Dim serializer As New XmlSerializer(GetType(Character))
Using writer As New StreamWriter("C:\temp\newCharacter.STC")
    serializer.Serialize(writer, GVar.CharacterFile)
End Using
结果说明

修改后生成的XML会包含你填充的所有内容,所有子节点会嵌套在Character根节点下,不需要拆分多个文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:36:02