尝试将 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