You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:33:00