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
相关产品推荐
相关产品推荐

