【问题标题】:How can i serialize and deserialize a dictionary in vb.net?如何在 vb.net 中序列化和反序列化字典?
【发布时间】:2013-08-21 17:13:40
【问题描述】:

我正在使用一个应用程序,该应用程序需要在文件中存储 40 000 多个键和值的大型字典,然后在启动时将它们重新加载到字典中......现在我正在使用简单的字符分隔和 split 和启动时的每个循环,例如: key1=value1|key2=value2|key3=value3等等...

但是,我正在寻找一种更有效的序列化和反序列化字典的方法......同时考虑到序列化数据的大小,因为有很多条目。

【问题讨论】:

  • 考虑使用数据库。
  • 我知道数据库是首选,但我希望有一个替代 php 序列化字典关联数组的方法。

标签: vb.net serialization dictionary


【解决方案1】:

你可以使用BinaryFormatter
在我的中端机器上:保存耗时:390ms 负载耗时:359ms 保存的数据约为 1500kb

'save
Dim dict = New Dictionary(Of String, String)
For i = 1 To 40000
    dict.Add("key" & i, "value" & i)
Next
Dim fs As IO.FileStream = New IO.FileStream("d:\test\test.bin", IO.FileMode.OpenOrCreate)
Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
bf.Serialize(fs, dict)
fs.Close()

'load
Dim fsRead As New IO.FileStream("d:\test\test.bin", IO.FileMode.Open)
Dim objTest As Dictionary(Of String, String) = bf.Deserialize(fsRead)
fsRead.Close()

【讨论】:

  • 这可以存储为字符串吗?
  • 别担心,BinaryFormatter 将其保存为二进制数据,这样访问速度相当快,而不是人类可读性,您可以考虑XmlSerializer,另一种标准甚至手动序列化。
  • 我现在做的是手动序列化的一种形式......我认为二进制序列化会更快,我要问的唯一原因是我需要在同一个文件中存储多个序列化字典,因此我需要一个分割点来在加载时将它们分开......
  • 当然可以通过在文件末尾附加字符串来实现拆分它们,指示较大文件中每个单独的字典字节位置,然后使用 fseek 从每个点读取...
  • 原来这个序列化占用的空间大约是我手动序列化的4倍……有没有什么方法会占用更少的空间?……
【解决方案2】:

这在使用堆叠字典时效果很好:

Dim DataDict as New Dictionary(Of String,Dictionary(Of String,String))

这是一个嵌入式字典被序列化以进行读写的工作示例:

Imports System.IO
Module Modules
  Public Sub TestDict()
    Dim DictsToSave As New Dictionary(Of String, Dictionary(Of String, String))
    For DictsToHave = 1 To 10
        Dim SingelDictData As New Dictionary(Of String, String)
        For Values = 1 To 10000
            SingelDictData.Add("Key " & Values.ToString(), "Value " & Values.ToString())
        Next
        DictsToSave.Add("Key " & DictsToHave.ToString(), SingelDictData)
    Next
    Dim WriteResult = WriteMultiSerializedDict("D:\TestDict.Bin", DictsToSave)
    Dim ReadResult As Dictionary(Of String, Dictionary(Of String, String)) = ReadMultiSerializedDict("D:\TestDict.Bin")

End Sub
Public Function WriteMultiSerializedDict(ByVal FullPath As String, ByVal DataDict As Dictionary(Of String, Dictionary(Of String, String))) As Boolean
    Try
        Dim FileStream As IO.FileStream = New FileStream(FullPath, IO.FileMode.OpenOrCreate)
        Dim BinFormatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
        BinFormatter.Serialize(FileStream, DataDict)
        FileStream.Close()
        Return True
    Catch ex As Exception
        Return False
    End Try
End Function
Public Function ReadMultiSerializedDict(ByVal FullPath As String) As Dictionary(Of String, Dictionary(Of String, String))
    Try
        Dim DataDict As New Dictionary(Of String, Dictionary(Of String, String))
        Dim FileStream As IO.FileStream = New FileStream(FullPath, IO.FileMode.Open)
        Dim BinFormatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
        DataDict = BinFormatter.Deserialize(FileStream)
        FileStream.Close()
        Return DataDict
    Catch ex As Exception
        Return Nothing
    End Try
End Function

在我的中端开发机器上,写入大约需要 260 毫秒,读取大约需要 545 毫秒,文件大小为 3.70 mb。重要提示:如果您更改任何字典的键(而不是值),加载炸弹!因此,作为编程问题,请始终以相同的顺序组装您的 dicts。我以前使用过这种方法,在子字典中使用了 5 100 个键/值对,没有问题。

【讨论】:

    猜你喜欢
    • 2011-05-13
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多