尝试将 List 对象写入 XML (VB.net)
Trying to write a List object to XML (VB.net)
我将非 List 对象写入 XML 没有遇到任何问题,它按预期进行读写。但是,将 List 对象写入 XML 会使我的整个 export/import 过程陷入困境,我不明白为什么。
对象基于此 class:
Public Class PowerArray
'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 Object)
Public Desc As String
End Class
从 Class 创建的对象是:
Public Shared Property CharPowers As New List(Of PowerArray)
例如,我可以将对象“CharCore”(根据 class“字符”定义,它不是列表)写入 XML 就好了。
如果我尝试将 CharPowers 作为填充列表写入 XML,它会引发错误:
Dim writer As New System.Xml.Serialization.XmlSerializer(GetType(frmMain.PowerArray))
Dim file As New System.IO.StreamWriter("c:\temp\" + "PowerTest.PWR")
writer.Serialize(file, frmMain.GVar.CharPowers)
file.Close()
-错误“InvalidCastException:无法将类型 'System.Collections.Generic.List`1[NICO_SP_v2.frmMain+PowerArray]' 的对象转换为类型 'PowerArray'。”
我不确定这里的 List 有何不同。任何帮助将不胜感激。
编辑:添加注释,回复:字符 class
Dim writer As New System.Xml.Serialization.XmlSerializer(GetType(Character))
Dim file As New System.IO.StreamWriter("C:\temp\chartest_A.STC")
writer.Serialize(file, GVar.CharacterFile)
An Xml document must have a root element,即不能在顶层只有一堆元素。因此,改为制作一个 class 来保存 PowerArray
的列表
让你的class像这样
Imports System.IO
Imports System.Xml.Serialization
<XmlRoot>
Public Class PowerArrays
<XmlElement("PowerArray")>
Public Property List As List(Of PowerArray)
End Class
Public Class PowerArray ' unchanged
'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 Object)
Public Desc As String
End Class
并改为序列化根目录
Dim powers = New PowerArrays() With {.List = frmMain.GVar.CharPowers.ToList()}
Dim serializer As New XmlSerializer(GetType(PowerArrays))
Using writer As New StreamWriter($"c:\temp\{PowerTest.PWR}")
serializer.Serialize(writer, powers)
End Using
您的 Xml 应该会导致
<?xml version="1.0" encoding="utf-8"?>
<PowerArrays>
<PowerArray>
<Name>foo</Name>
...
</PowerArray>
<PowerArray>
<Name>bar</Name>
...
</PowerArray>
</PowerArrays>
反向反序列化
Dim powers = New PowerArrays()
Dim serializer As New XmlSerializer(GetType(PowerArrays))
Using reader As New StreamReader($"c:\temp\{PowerTest.PWR}")
powers = DirectCast(serializer.Deserialize(reader), PowerArrays)
End Using
我将非 List 对象写入 XML 没有遇到任何问题,它按预期进行读写。但是,将 List 对象写入 XML 会使我的整个 export/import 过程陷入困境,我不明白为什么。
对象基于此 class:
Public Class PowerArray
'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 Object)
Public Desc As String
End Class
从 Class 创建的对象是:
Public Shared Property CharPowers As New List(Of PowerArray)
例如,我可以将对象“CharCore”(根据 class“字符”定义,它不是列表)写入 XML 就好了。
如果我尝试将 CharPowers 作为填充列表写入 XML,它会引发错误:
Dim writer As New System.Xml.Serialization.XmlSerializer(GetType(frmMain.PowerArray))
Dim file As New System.IO.StreamWriter("c:\temp\" + "PowerTest.PWR")
writer.Serialize(file, frmMain.GVar.CharPowers)
file.Close()
-错误“InvalidCastException:无法将类型 'System.Collections.Generic.List`1[NICO_SP_v2.frmMain+PowerArray]' 的对象转换为类型 'PowerArray'。”
我不确定这里的 List 有何不同。任何帮助将不胜感激。
编辑:添加注释,回复:字符 class
Dim writer As New System.Xml.Serialization.XmlSerializer(GetType(Character))
Dim file As New System.IO.StreamWriter("C:\temp\chartest_A.STC")
writer.Serialize(file, GVar.CharacterFile)
An Xml document must have a root element,即不能在顶层只有一堆元素。因此,改为制作一个 class 来保存 PowerArray
的列表让你的class像这样
Imports System.IO
Imports System.Xml.Serialization
<XmlRoot>
Public Class PowerArrays
<XmlElement("PowerArray")>
Public Property List As List(Of PowerArray)
End Class
Public Class PowerArray ' unchanged
'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 Object)
Public Desc As String
End Class
并改为序列化根目录
Dim powers = New PowerArrays() With {.List = frmMain.GVar.CharPowers.ToList()}
Dim serializer As New XmlSerializer(GetType(PowerArrays))
Using writer As New StreamWriter($"c:\temp\{PowerTest.PWR}")
serializer.Serialize(writer, powers)
End Using
您的 Xml 应该会导致
<?xml version="1.0" encoding="utf-8"?>
<PowerArrays>
<PowerArray>
<Name>foo</Name>
...
</PowerArray>
<PowerArray>
<Name>bar</Name>
...
</PowerArray>
</PowerArrays>
反向反序列化
Dim powers = New PowerArrays()
Dim serializer As New XmlSerializer(GetType(PowerArrays))
Using reader As New StreamReader($"c:\temp\{PowerTest.PWR}")
powers = DirectCast(serializer.Deserialize(reader), PowerArrays)
End Using