VB.NET中List(Of Long)序列化与快速反序列化实现方法问询
嘿,这个需求我太熟了!处理2GB级别的List(Of Long),每次都从文本文件读取确实慢到让人抓狂,用二进制序列化做持久化,后续反序列化的速度能直接拉满。下面给你两种VB.NET里的高效实现方案,从快速上手到极致优化都覆盖了:
方法1:用BinaryFormatter快速实现(简单易上手)
如果你的项目基于.NET Framework,或者不想折腾底层二进制操作,BinaryFormatter是最省事的选择——几行代码就能搞定序列化和反序列化,完全不用关心细节。
Imports System.IO Imports System.Runtime.Serialization.Formatters.Binary ' 序列化List(Of Long)到本地文件 Public Sub SerializeLongList(list As List(Of Long), filePath As String) Using fs As New FileStream(filePath, FileMode.Create) Dim formatter As New BinaryFormatter() formatter.Serialize(fs, list) End Using End Sub ' 从文件反序列化回List(Of Long) Public Function DeserializeLongList(filePath As String) As List(Of Long) Using fs As New FileStream(filePath, FileMode.Open) Dim formatter As New BinaryFormatter() Return DirectCast(formatter.Deserialize(fs), List(Of Long)) End Using End Function
优缺点:
- ✅ 优点:代码极简,零额外逻辑,开箱即用
- ❌ 缺点:序列化后的文件会携带.NET类型元数据,体积比纯二进制大一点;另外在.NET Core/.NET 5+中
BinaryFormatter被标记为过时,不推荐用于新项目
方法2:直接读写二进制数组(极致性能首选)
List(Of Long)的底层其实就是Long()数组,直接操作这个数组的二进制数据,能彻底避开序列化框架的额外开销,速度和文件体积都是最优的——这也是我处理大体积数值列表时的首选方案。
Imports System.IO ' 序列化:直接把List的底层数组写入文件(先写元素计数,再写纯二进制数据) Public Sub SerializeLongListOptimized(list As List(Of Long), filePath As String) ' 先清理List的冗余空间,避免写入无效数据 list.TrimExcess() Using fs As New FileStream(filePath, FileMode.Create) ' 第一步:写入元素总数(4字节整数,方便反序列化时确定数组大小) fs.Write(BitConverter.GetBytes(list.Count), 0, 4) ' 第二步:直接写入整个Long数组的二进制数据(每个Long占8字节) Dim longArray = list.ToArray() fs.Write(BitConverter.GetBytes(longArray), 0, longArray.Length * 8) End Using End Sub ' 反序列化:直接读取二进制数据到数组,再包装成List Public Function DeserializeLongListOptimized(filePath As String) As List(Of Long) Using fs As New FileStream(filePath, FileMode.Open) ' 第一步:读取元素总数 Dim countBuffer(3) As Byte fs.Read(countBuffer, 0, 4) Dim elementCount As Integer = BitConverter.ToInt32(countBuffer, 0) ' 第二步:读取所有Long的二进制数据 Dim dataBuffer(elementCount * 8 - 1) As Byte fs.Read(dataBuffer, 0, dataBuffer.Length) ' 第三步:把二进制数据转换成Long数组,再转成List Dim resultArray(elementCount - 1) As Long Buffer.BlockCopy(dataBuffer, 0, resultArray, 0, dataBuffer.Length) Return New List(Of Long)(resultArray) End Using End Function
优缺点:
- ✅ 优点:速度最快(几乎是内存级别的读写速度),文件体积最小(仅4 + 8*N字节,和原始数据体积几乎一致),兼容所有.NET版本
- ❌ 缺点:需要自己处理二进制读写的细节,代码比第一种方法多一点,但逻辑非常简单
额外小贴士
如果你的内存不足以一次性加载2GB的列表,可以考虑用MemoryMappedFile分段读取,避免内存溢出——不过一般来说,现代PC的内存都能轻松容纳2GB的数据,所以上面的方案足够用了。
另外,别用JSON或者XML序列化!它们的速度和体积对于这种大体积数值列表来说完全不友好,纯二进制才是最优解。
内容的提问来源于stack exchange,提问作者tmighty
相关产品推荐
相关产品推荐

