我试图获取一个类,用该类定义一个对象,然后将该对象写入 XML。看起来我可以用“公共共享”创建一个类(下面发布),创建一个由该类(字符)定义的公共共享对象,用数据填充它,然后直接将其写入 XML。我遇到了很多困难,从引用错误到创建的对象“写入”,但尽管有值,但还是空白。
我只能假设我对如何从 vb.net 编写 XML 缺乏基本的了解,尽管进行了大量研究,但我并不觉得这里更接近解决方案。
班级:
Public Class Character
Public Class CharacterStats
<XmlElement("CoreList")>
Public Shared ListCore As CoreStats
End Class
Public Class PowerList
<XmlElement("PowerList")>
Public Shared ListPowers As List(Of Power)
End Class
Public Class EdgeList
<XmlElement("EdgesList")>
Public Shared ListEdges As Edges
End Class
Public Class WeaponList
<XmlElement("WeaponList")>
Public Shared ListWeps As List(Of Weapon)
End Class
Public Class ArmorList
<XmlElement("ArmorList")>
Public Shared ListArm As List(Of Armor)
End Class
Public Class VehicleList
<XmlElement("VehicleList")>
Public Shared ListVeh As List(Of Vehicle)
End Class
End Class
Run Code Online (Sandbox Code Playgroud)
定义对象(?):
Public Class GVar
Public Shared Property CharacterFile As New Character
End Class
Run Code Online (Sandbox Code Playgroud)
然后,尝试在子目录中将其写入 XML:
Dim serializer As New XmlSerializer(GetType(Character))
Dim writer As New StreamWriter("C:\temp\newCharacter.STC")
serializer.Serialize(writer, GVar.CharacterFile)
writer.Close()
Run Code Online (Sandbox Code Playgroud)
虽然此方法“有效”,但它输出的 XML 文件除了标头之外是空白的:
<?xml version="1.0" encoding="utf-8"?>
Run Code Online (Sandbox Code Playgroud)
我确信我只是错过了一些非常明显的东西,但它完全逃脱了我的视线。
编辑/更新:
每个公共共享项都是从其他类定义的,每个类都有自己的一组值。我将以其中一个为例,尽管它们的结构都很相似:
Public Class Power
'Array that stores Powers for active character
Public Name As String
Public PRating As Integer
Public Action As String
Public Cost As Integer
Public PoolNone As String
Public Pool1 As String
Public Pool2 As String
Public Range As String
Public Duration As String
Public Tags As New List(Of String)
Public Desc As String
End Class
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,公共类“角色”具有(因为它是第二个条目)公共共享列表权力,作为“权力”列表,如此处定义。最初这样做是为了初始化每个不同类类型(Core、Power 等)的对象,这些类类型是从内部读取/写入的。
我希望能够创建一个根来将所有这些子类嵌套到一个 XML 文件中,而不必在保存时将它们全部分解为自己的 XML 文件。
您的类中有一堆不必要的类定义,并且这些类中有共享属性,这可能不是您想要的。以下是 Character 类的样子
<XmlRoot>
Public Class Character
<XmlElement()>
Public Property Core As CoreStats
<XmlElement("Power")>
Public Property Powers As List(Of Power)
<XmlElement()>
Public Property Edges As Edges
<XmlElement("Weapon")>
Public Property Weapons As List(Of Weapon)
<XmlElement("Armor")>
Public Property Armors As List(Of Armor)
<XmlElement("Vehicle")>
Public Property Vehicles As List(Of Vehicle)
End Class
Public Class CoreStats
' properties in here in your implementation
End Class
Public Class Power
End Class
Public Class Edges
End Class
Public Class Weapon
End Class
Public Class Armor
End Class
Public Class Vehicle
End Class
Run Code Online (Sandbox Code Playgroud)
顺便说一下带有“Power”的属性
<XmlElement("Power")>
Public Property Powers As List(Of Power)
Run Code Online (Sandbox Code Playgroud)
意味着 Xml 将具有名为 Power 的元素,这些元素被序列化到 Powers 属性中。如果属性中没有名称,序列化程序将写入/查找名为属性名称(Powers)的元素,即
和<XmlElement()> Public Property Powers As List(Of Power)
<Character>
<Powers>
</Powers>
<Powers>
</Powers>
</Character>
Run Code Online (Sandbox Code Playgroud)
与<XmlElement("Power")> Public Property Powers As List(Of Power)
<Character>
<Power>
</Power>
<Power>
</Power>
</Character>
Run Code Online (Sandbox Code Playgroud)
你当然可以有更多级别的属性,例如,如果 Power 类里面有一个列表,它可能看起来像这样
Public Class Power
<XmlElement("SubPower")>
Public Property SubPowers As List(Of SubPower)
End Class
Public Class SubPower
End Class
Run Code Online (Sandbox Code Playgroud)
并且序列化器将考虑所有这些附加级别的类/属性,即
Public Class Power
<XmlElement("SubPower")>
Public Property SubPowers As List(Of SubPower)
End Class
Public Class SubPower
End Class
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您还可以将原始属性设置为 Attributes,如下所示
<Character>
<Power>
<SubPower>
</SubPower>
<SubPower>
</SubPower>
</Power>
<Power>
</Power>
</Character>
Run Code Online (Sandbox Code Playgroud)
Public Class Power
<XmlAttribute>
Public Name As String
<XmlAttribute>
Public PRating As Integer
<XmlAttribute>
Public Action As String
...
<XmlElement("Tag")>
Public Tags As New List(Of String)
End Class
Run Code Online (Sandbox Code Playgroud)