为什么.net泛型字典如此之大

时间:2010-04-30 15:56:04

标签: .net vb.net generics serialization

我在VB.net中序列化一个通用词典,我很惊讶它只有一个项目约1.3kb。我做错了什么,或者我还应该做些什么呢?我有大量的词典,它正在杀死我把它们全部发送到网上。我用于序列化的代码是

    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

2 个答案:

答案 0 :(得分: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 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0?System.Collections.Generic.KeyValuePair { {1}} 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

答案 1 :(得分:4)

设置序列化字典需要很多开销(显然,大约是1.3kb;))。但是,如果您使用基本类型的键和值,则会发现大小不会随着更多元素添加到集合中而显着增长。

这种开销主要是一次性的前期成本 - 所以一旦你将Dictionary类序列化,所包含的成员就不会增加那么多的大小。