2017-03-08 52 views
2

这里是我的数组:试图保存结构文件和加载的文件从一个数组(序列化,反序列化)

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 
+0

其实你的代码应工作原样。你确定'SaveLocation'和'LoadLocation'指向同一个文件吗?也许有一个'FileLocation'并将其作为参数传递给你的潜艇会更好。另外考虑尝试一个使用块,它更直观。 – tinstaafl

回答

1

这可能是错的第一件事情是这样的:

Public CompatibilityArr() As String 

名称的基础上它似乎应该是第二个Compatibility结构。如果是这样,它应该是:

Public CompatibilityArr As Compatibility() 

其如果是所描述(but when loading the array and it's indexes are still 'nothing'是模糊的,因为存在多于一个阵列)问题的一部分不清晰。否则,第二个结构不被使用。

Next,set Option Strict On。反序列化时,将BinaryFormatter总是返回Object需要被转换为正确的类型:

Racers = DirectCast(bf.Deserialize(fs), Racer()) ' read from file 

有了这些变化2,所有的数据进行的往返对我很好。

第三,Structure是不正确的类型。这些应该是类,而不是公共字段/成员,使用性能尤其是如果有是有约束力的任何涉及的数据:

<Serializable()> 
Public Class Racer 
    Public Property Name As String 
    ... 

而且,任何它实现了Dispose()方法,像FileStream应该在Using使用块,将关闭与目标对象的处理:

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

+0

谢谢你们所有的精彩建议!现在一切工作都令人满意,我无法对你表示感谢。我一定会在将来刷我的列表:) –

+0

列表非常像一个数组,但你不必知道它有多大 - 它们自动增长。为此:'Racers = DirectCast(bf。反序列化(fs),列表(赛车手))赛车运动员的地方:Dim Racers As List(Racer)这是你需要知道的列表的85% – Plutonix

+0

参见** [五分钟课程介绍和列表](http://stackoverflow.com/a/34164458)**还添加了一个链接到MSDN关于类与结构 – Plutonix

1

出于某种原因,我从未有过的好运气序列化到使用BinaryFormatter的文件。确切的原因失去了时间的迷雾,但我确实知道,SoapFormatter正常工作对我来说:

Using oStream As Stream = File.Open(SaveLocation, FileMode.Create, IO.FileAccess.Write) 
     If oStream IsNot Nothing Then 
      Call (New System.Runtime.Serialization.Formatters.Soap.SoapFormatter).Serialize(oStream, InputRacers.RacersArray) 
     End If 
    End Using