2010-04-30 27 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类的序列化,包含的成员不会增加太多的大小。

相关问题