arrays - 尝试将结构数组保存到文件并从文件加载(序列化、反序列化)

标签 arrays vb.net serialization structure record

这是我的数组:

    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 分钟。

MSDN:Choosing Between Class and Struct

关于arrays - 尝试将结构数组保存到文件并从文件加载(序列化、反序列化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42661701/

相关文章:

java - 关于如何使用数组、类和方法启动程序来在 java 中存储学生详细信息的建议?

c# - 检测客户端与 TCP/IP 断开连接的正确方法

c# - 使用 C# 反序列化 JSON(多个对象)

python - 如何将列表 [a, b, c] 转换为 python slice index[ :a, :b :c]?

javascript - 如何在 JavaScript 中的 JSON 对象声明中跳过参数或将参数传递到子节点

vb.net - LINQ to SQL 并使用 OR 子句连接两个表

vb.net - VB.NET 中对象声明中的 (As) 和 (=) 有什么区别

java - Java 中是否有使用 writeObject 方法的开源对象到 XML 序列化程序

java - 将对象转换为字节数组会抛出 NotSerializedException

java - 对数组元素进行排序时某些输入上的 ArrayIndexOutOfBoundExceptions?