Я сериализирую универсальный словарь в VB.net, и я очень удивлен, что это - приблизительно 1.3 КБ с единственным объектом. Я делаю что-то не так или являюсь там чем-то еще, что я должен делать? У меня есть большое количество словарей, и оно уничтожает меня для отправки их всех через провод. Код, который я использую для сериализации,
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
Сериализация по умолчанию для словаря должна включать информацию о типе словаря, используемом компараторе и типах каждого элемента (ключа и значения), поскольку они могут быть подтипами. Эти накладные расходы должны быть добавлены для каждого словаря. Если распечатать данные в виде строки, то можно увидеть, что здесь много полностью определенных типов, занимающих много байт:
\0\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.KeyValuePair2[[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\0\t\0\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. KeyValuePair2[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=2.0.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\0\v
Вы можете предпочесть использовать собственный формат для сериализации, или же стандартный формат, который немного легче, например JSON.
Существует много накладных расходов, связанных с установкой словаря для сериализации (очевидно, примерно 1,3 кб ;) ). Однако вы обнаружите, что размер не будет резко увеличиваться по мере добавления новых элементов в коллекцию, если вы используете примитивные типы для ключей и значений.
Эти накладные расходы являются в основном единовременными, предварительными затратами - поэтому, как только вы получите сериализованный класс Dictionary, содержащиеся в нем члены не будут увеличивать размер.