这是我的数组:
Public RacersArray(AmountOfRacers - 1) As Racer
<Serializable()> Public Structure Racer
Public Name As String
Public CleatSize As String
Public SkillLevel As String
Public Height As String
Public Team As String
Public CompatibilityArr() As String
End Structure
<Serializable()> Public Structure Compatibility
Public Name As String
Public Score As Integer
End Structure
下面是我用来尝试从文件保存和加载的代码。该文件正在填充看起来正确的乱码,但在加载数组时,它的索引仍然是“无”
Public Sub RacersInputSAVE()
Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
Dim fStream As New FileStream(SaveLocation, FileMode.Create)
bf.Serialize(fStream, InputRacers.RacersArray) ' write to file
fStream.Close()
End Sub
Public Sub RacersInputLOAD()
Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
Dim fStream As New FileStream(LoadLocation, FileMode.Open)
InputRacers.RacersArray = bf.Deserialize(fStream) ' read from file
fStream.Close()
End Sub
最佳答案
第一件事可能是错误的:
Public CompatibilityArr() As String
根据名称,这似乎应该是第二个 Compatibility
结构。如果是的话,应该是:
Public CompatibilityArr As Compatibility()
尚不清楚这是否是所描述问题的一部分(但是在加载数组时,它的索引仍然是“无”
,因为有多个数组,所以很模糊)。否则第二个结构不会被使用。
下一步,设置Option Strict On
。反序列化时,BinaryFormatter
始终返回 Object
,需要将其转换为正确的类型:
Racers = DirectCast(bf.Deserialize(fs), Racer()) ' read from file
通过这两项更改,所有数据都使我的往返行程变得顺利。
第三, Structure
不是正确的类型。这些应该是类,而不是公共(public)字段/成员,而是使用属性,特别是在涉及任何数据绑定(bind)时:
<Serializable()>
Public Class Racer
Public Property Name As String
...
此外,任何实现 Dispose()
方法的内容(例如 FileStream
)都应该在 Using
block 中使用,该 block 将关闭并处置目标对象:
Dim bf As New BinaryFormatter
Using fs As New FileStream(fileName, FileMode.Create)
bf.Serialize(fs, Racers) ' write to file
End Using
最后,您可能会发现一些 NET 集合(例如 List(Of Racer)
)比数组更容易使用。了解它们的工作原理大约需要 15 分钟。
关于arrays - 尝试将结构数组保存到文件并从文件加载(序列化、反序列化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42661701/