【问题标题】:Load data from serialization to listbox将数据从序列化加载到列表框
【发布时间】:2015-06-23 10:53:31
【问题描述】:

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

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

任何帮助都将不胜感激,即使是正确方向的一点。

提前致谢!!

【问题讨论】:

  • 如果答案有帮助,请投票/单击复选标记,以便将其从未答复列表中删除

标签: vb.net serialization deserialization


【解决方案1】:

ListBox ObjectCollection (Items) 未标记为可序列化,因此您不能一次序列化整个事物。您可能遇到过这种情况并使用循环来序列化每个项目。循环似乎确实对每个项目进行了序列化,但我不知道如何在循环中反序列化 - 你不会知道有多少项目,Serializer 也不会。

您可以将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) 使其更简单,并将其分配为数据源。

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

使用列表作为数据源,您不必将项目从这里复制到那里 - 列表中的任何内容都会出现在列表框中。序列化也很简单:

bf.Serialize(fs, myLBItems)

由于反序列化返回一个对象,你需要强制转换它(Option Strict):

myLBItems = CType(bf.Deserialize(fs), List(Of String))

注意:这可能根本不是您想要的。您的代码将 ListBox 中的内容转换为 String 后对其进行序列化。稍后,您似乎想反序列化为 MySettings 类型。

如果MySettings 类似于名称和值对(或它们的集合),则可能一半的数据和所有类型信息都将丢失。

【讨论】:

    猜你喜欢
    • 2011-08-22
    • 2013-01-02
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    相关资源
    最近更新 更多