Почему является .NET универсальным словарем, настолько большим

Я сериализирую универсальный словарь в 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
7
задан thefroatgt 30 April 2010 в 15:56
поделиться

2 ответа

Сериализация по умолчанию для словаря должна включать информацию о типе словаря, используемом компараторе и типах каждого элемента (ключа и значения), поскольку они могут быть подтипами. Эти накладные расходы должны быть добавлены для каждого словаря. Если распечатать данные в виде строки, то можно увидеть, что здесь много полностью определенных типов, занимающих много байт:

\0\0\0\0\0????\0\0\0\0\0\0\0\0\0\0?System.Collections.Generic.Dictionary2[[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.GenericEqualityComparer1[[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.GenericEqualityComparer1[[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.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\0keyvalue\0\0\b\b\0\0\0\0\0\v

Вы можете предпочесть использовать собственный формат для сериализации, или же стандартный формат, который немного легче, например JSON.

7
ответ дан 6 December 2019 в 23:02
поделиться

Существует много накладных расходов, связанных с установкой словаря для сериализации (очевидно, примерно 1,3 кб ;) ). Однако вы обнаружите, что размер не будет резко увеличиваться по мере добавления новых элементов в коллекцию, если вы используете примитивные типы для ключей и значений.

Эти накладные расходы являются в основном единовременными, предварительными затратами - поэтому, как только вы получите сериализованный класс Dictionary, содержащиеся в нем члены не будут увеличивать размер.

4
ответ дан 6 December 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: