.net 序列化列表(长)
在VB.NET中,我从文本文件中读取了大约2GB的长值,并将其写入了长列表中 因为将文本文件中的值读入ListOf Long相当耗时,所以我想序列化ListOf Long,希望VB.NET能为我提供一种快速反序列化它的方法 我怎么能这样做.net 序列化列表(长),.net,vb.net,serialization,.net,Vb.net,Serialization,在VB.NET中,我从文本文件中读取了大约2GB的长值,并将其写入了长列表中 因为将文本文件中的值读入ListOf Long相当耗时,所以我想序列化ListOf Long,希望VB.NET能为我提供一种快速反序列化它的方法 我怎么能这样做 谢谢大家! 下面是一个使用XmlSerialization存储和检索数据的示例。在窗体上放置两个按钮BTN序列化、BTN序列化和ProgressBar ProgressBar1。这导致我的系统上有一个2.31 GB的文件。它确实需要一段时间来处理,因此异步代码
谢谢大家! 下面是一个使用XmlSerialization存储和检索数据的示例。在窗体上放置两个按钮BTN序列化、BTN序列化和ProgressBar ProgressBar1。这导致我的系统上有一个2.31 GB的文件。它确实需要一段时间来处理,因此异步代码和marquee progressbar 请注意,对于如此大的文件,它无法使用XmlSerializer一次性反序列化整个内容。相反,我们必须逐个记录地读取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
序列化有一些开销,而且很可能会比较慢。您最好的选择可能是使用流。2GB的数据量很大,有没有办法只加载一部分您需要的数据?谢谢。我真的需要这一切。