2010-04-30 15 views
7

Estoy serializando un diccionario genérico en VB.net y estoy muy sorprendido de que sea de aproximadamente 1.3kb con un solo elemento. ¿Estoy haciendo algo mal, o hay algo más que debería estar haciendo? Tengo una gran cantidad de diccionarios y me está matando enviarlos a través del cable. El código que utilizo para la serialización es¿Por qué es tan grande un diccionario .net genérico

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 

Respuesta

7

La serialización predeterminada para un diccionario debe incluir información de tipo para el tipo de diccionario, el comparador utilizado y para los tipos de cada uno de los elementos (clave y valor) porque en general pueden ser subtipos. Esta sobrecarga debe agregarse para cada diccionario. Si imprime los datos como una cadena, puede ver que hay una gran cantidad de tipos totalmente calificados que ocupan muchos bytes:

\ 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 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

Es posible que prefiera utilizar un formato personalizado para la serialización, o bien un formato estándar que sea ligeramente más liviano, como JSON.

4

Hay un montón de gastos que conlleva la creación del diccionario para la serialización (obviamente, aproximadamente 1,3 kb;)). Sin embargo, descubrirá que el tamaño no aumenta dramáticamente a medida que se agregan más elementos a su colección, siempre que esté utilizando tipos primitivos para claves y valores.

Esta sobrecarga es principalmente una vez, costo inicial, por lo que una vez que obtiene la clase de diccionario serializada, los miembros contenidos no agregan el mismo tamaño.

Cuestiones relacionadas