2010-04-30 69 views
7

我在VB.net中序列化一個通用字典,我很驚訝它的單個項目大約是1.3kb。我做錯了什麼,還是有什麼我應該做的?我有大量的字典,它們都是通過電線發送給我的。我用於序列化的代碼是爲什麼.net通用字典如此之大

Dim dictionary As New Dictionary(Of Integer, Integer) 
    Dim stream As New MemoryStream 
    Dim bformatter As New BinaryFormatter() 

    dictionary.Add(1, 1) 

    bformatter.Serialize(stream, dictionary) 

    Dim len As Long = stream.Length 

回答

7

字典的默認序列化必須包含字典類型,使用的比較器以及每個項(鍵和值)的類型的類型信息,因爲它們通常可能是子類型。這個開銷必須爲每個字典添加。如果將數據打印爲字符串,則可以看到有很多完全限定類型佔用大量字節:

\ 0 \ 0 \ 0 \ 0 ???? \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 System.Collections.Generic.Dictionary 2[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]\0\0\0\aVersion\bComparer\bHashSize\rKeyValuePairs\0\0\b?System.Collections.Generic.GenericEqualityComparer 1 [[System.Int32,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]] \ b System.Collections.Generic.KeyValuePair 2[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]][]\0\0\0\t\0\0\0\0\0\0\t\0\0\0\0\0\0?System.Collections.Generic.GenericEqualityComparer 1 [[System.Int32,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]] \ 0 \ 0 \ 0 \ 0 \ a \ 0 \ 0 \ 0 \ 0 System.Collections.Generic.KeyValuePair 2[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]?????System.Collections.Generic.KeyValuePair 2 [[System.Int32,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.Int32 ,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]] \ 0 \ 0 \ 0keyvalue \ 0 \ 0 \ b \ b \ 0 \ 0 \ 0 \ 0 \ v

您可能更願意使用自定義格式進行序列化,或使用稍微更輕的標準格式,如JSON

4

有很多開銷涉及到設置字典序列化(顯然,大約1.3kb;))。但是,如果您使用基本類型的鍵和值,則會發現隨着更多元素添加到集合中,大小不會顯着增長。

這個開銷主要是一次性的前期成本 - 所以一旦你獲得了Dictionary類的序列化,包含的成員不會增加太多的大小。

相關問題