将数据从序列化加载到列表框

时间:2015-04-16 19:57:19

标签: vb.net serialization deserialization

我能够完美地写入文件...但是我无法从文件读取并将读取数据插入列表框中。

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

任何帮助都会受到赞赏,甚至是正确方向的一点。

提前致谢!!

1 个答案:

答案 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类似于名称和值对(或它们的集合),则可能会丢失一半数据和所有类型信息。