我能够完美地写入文件...但是我无法从文件读取并将读取数据插入列表框中。
Public myData As New MySettings
Public saveFile As String = ("mysettings.ini")
'SAVE INFO TO SETTINGS FILE
Dim fs As Stream = New FileStream(saveFile, FileMode.Create)
Dim bf As BinaryFormatter = New BinaryFormatter()
For l_index As Integer = 0 To ListBox1.Items.Count - 1
Dim l_text As String = CStr(ListBox1.Items(l_index))
bf.Serialize(fs, l_text)
Next
fs.Close()
Return
这是我遇到麻烦的部分......
'LOAD INFO FROM SETTINGS FILE
Dim fs As Stream = New FileStream(saveFile, FileMode.Open)
Dim bf As BinaryFormatter = New BinaryFormatter()
For l_index As Integer = 0 To saveFile.Count - 1
Dim l_text As String = CStr(saveFile(l_index))
'myData = CType(bf.Deserialize(fs), CType(myData))
ListBox1.Items.Add(myData)
Next
fs.Close()
Return
任何帮助都会受到赞赏,甚至是正确方向的一点。
提前致谢!!
答案 0 :(得分:0)
ListBox ObjectCollection
(Items)未标记为可序列化,因此您无法一次序列化整个事物。您可能遇到过这种情况并使用循环来序列化每个项目。循环看起来似乎是序列化每个项目,但我不知道如何在循环中反序列化 - 你不知道有多少项,串行器也不会。
您可以将ListBox
项复制到数组并序列化整个项目,而不是一次只有一个项目:
Dim ary(lb.Items.Count - 1) As Object
lb.Items.CopyTo(ary, 0)
' OpenOrCreate!
Using fs As New FileStream("C:\Temp\lbitems.bin", FileMode.OpenOrCreate)
Dim bf As New BinaryFormatter
bf.Serialize(fs, ary)
End Using ' close and dispose of stream
反序列化恰恰相反:
Using fs As New FileStream("C:\Temp\lbitems.bin", FileMode.Open)
Dim bf As New BinaryFormatter
Dim myAry = bf.Deserialize(fs)
lb.Items.Clear()
lb.Items.Add(myAry)
End Using
您可以使用List(of String)
使其更简单,并将其指定为DataSource。
Private myLBItems As New List(Of String)
...
' fake items to add
myLBItems.Add("Foo")
myLBItems.Add("Bar")
myLBItems.Add("Option")
myLBItems.Add("Strict")
lb.DataSource = myLBItems
使用List作为DataSource,您不必将项目从此处复制到那里 - List中的任何内容都将出现在ListBox中。序列化也很简单:
bf.Serialize(fs, myLBItems)
由于Deserializing返回一个Object,你需要强制转换它(Option Strict
):
myLBItems = CType(bf.Deserialize(fs), List(Of String))
注意:这可能根本不是您想要的。在将代码转换为String后,您的代码将序列化ListBox中的内容。稍后,您似乎想要反序列化为MySettings
类型。
如果MySettings
类似于名称和值对(或它们的集合),则可能会丢失一半数据和所有类型信息。