【问题标题】:Serialize List(Of Long)序列化列表(长)
【发布时间】:2019-06-19 10:28:57
【问题描述】:

我已经从文本文件中读取了大约 2 GB 长值到 VB.NET 中的 List(Of Long) 中。

因为将文本文件中的值读取到 List(Of Long) 中非常耗时,所以我想序列化 List(Of Long),希望 VB.NET 能够为我提供一种快速反序列化它的方法。

我该怎么做?

谢谢!

【问题讨论】:

  • 序列化有一些开销,很可能会更慢。您最好的选择可能是只使用流。 2GB 是很多数据,有没有办法只加载其中的一部分(只加载你需要的)?
  • @the_lotus 谢谢。我真的需要这一切。

标签: .net vb.net serialization


【解决方案1】:

这是一个使用 XmlSerialization 存储和检索数据的示例。在窗体上放置两个按钮(btnSerialize、btnDeserialize)和一个 ProgressBar (ProgressBar1)。这导致我的系统上有一个 2.31 GB 的文件。处理确实需要一段时间,因此异步代码和字幕进度条。

请注意,对于如此大的文件,它不会使用XmlSerializer.Deserialize() 一次性反序列化整个内容(我遇到了“内存不足”异常)。相反,我们必须逐条读取xml文件,这样更节省内存:

Imports System.IO
Imports System.Xml
Imports System.Xml.Serialization

Public Class Form1

    Private FileName As String
    Private HugeListOfLongs As New List(Of Long)

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim MyDocs As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
        FileName = System.IO.Path.Combine(MyDocs, "LongData.xml")

        For L As Long = 0 To 100000000
            HugeListOfLongs.Add(L)
        Next
    End Sub

    Private Async Sub btnSerialize_Click(sender As Object, e As EventArgs) Handles btnSerialize.Click
        btnSerialize.Enabled = False
        btnDeserialize.Enabled = False
        ProgressBar1.Style = ProgressBarStyle.Marquee
        ProgressBar1.Visible = True

        Dim success As Boolean
        Await Task.Run(Sub()
                           Try
                               Dim xml As New XmlSerializer(HugeListOfLongs.GetType)
                               Using fs As New FileStream(FileName, FileMode.OpenOrCreate)
                                   fs.SetLength(0) ' make sure it's empty before we start writing (so you don't have trailing data if new file is smaller than previous one)
                                   xml.Serialize(fs, HugeListOfLongs)
                               End Using
                               success = True
                           Catch ex As Exception
                               MessageBox.Show("Failed to Serialize." & vbCrLf & vbCrLf & ex.ToString)
                               success = False
                           End Try

                       End Sub)

        ProgressBar1.Visible = False
        If success Then
            MessageBox.Show("Data successfully written to: " & vbCrLf & FileName)
        End If
        btnSerialize.Enabled = True
        btnDeserialize.Enabled = True
    End Sub

    Private Async Sub btnDeserialize_Click(sender As Object, e As EventArgs) Handles btnDeserialize.Click
        btnSerialize.Enabled = False
        btnDeserialize.Enabled = False
        ProgressBar1.Style = ProgressBarStyle.Marquee
        ProgressBar1.Visible = True

        Dim success As Boolean
        Await Task.Run(Sub()
                           HugeListOfLongs.Clear()
                           Try
                               Dim reader As XmlReader = XmlReader.Create(FileName)
                               While Not reader.EOF
                                   If reader.Read Then
                                       If reader.NodeType = XmlNodeType.Text Then
                                           HugeListOfLongs.Add(Long.Parse(reader.Value))
                                       End If
                                   End If
                               End While
                               reader.Close()
                               success = True
                           Catch ex As Exception
                               MessageBox.Show("Failed to Deserialize." & vbCrLf & vbCrLf & ex.ToString)
                               success = False
                           End Try
                       End Sub)

        ProgressBar1.Visible = False
        If success Then
            MessageBox.Show("Data successfully read from: " & vbCrLf & FileName & vbCrLf & vbCrLf & "Number of Longs: " & HugeListOfLongs.Count)
        End If
        btnSerialize.Enabled = True
        btnDeserialize.Enabled = True
    End Sub

End Class

【讨论】:

    猜你喜欢
    • 2012-09-23
    • 1970-01-01
    • 2013-05-20
    • 2017-07-23
    • 2020-11-17
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 2016-11-25
    相关资源
    最近更新 更多