首页 > 解决方案 > 尝试将 List 对象写入 XML (VB.net)

问题描述

我在将非列表对象写入 XML 时没有遇到任何问题,它可以按预期读写。但是让一个 List 对象写入 XML 将我的整个导出/导入过程扔在墙上,我不知道为什么。

对象是由此类构建的:

    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

从类创建的对象是:

Public Shared Property CharPowers As New List(Of PowerArray)

例如,我可以将对象“CharCore”(在“Character”类中定义,并且不是列表)写入 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 在这里有所不同。任何帮助,将不胜感激。

编辑:添加注释,重新:字符类

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)

标签: xmlvb.netlist

解决方案


Xml 文档必须有一个根元素,即不能只在顶层有一堆元素。所以改为创建一个类来保存 PowerArray 的列表

让你的课程像这样

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

推荐阅读