xml - 尝试将 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)
解决方案
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
推荐阅读
- haskell - Liquid Haskell:来自内联递归函数的“循环类型别名定义”错误
- java - 阅读 XBRL 事实 - Java
- html - Excel VBA从企业网络中的网页获取数据
- ruby-on-rails - 如何使用 Rails 中的条件在 has_many 上仅加入一条记录?
- ios - IONIC 3 - 底部标签 iPhone X UI 问题
- javascript - 如何为 webpack 配置提供自定义路径
- android - Button.setEnabled(false) 不会使按钮变灰
- user-interface - Spring Boot 管理员添加自定义选项卡
- php - 谷歌分析电子商务来源
- python - Pyspark 数据处理为矢量化格式