Почему общий словарь .net такой большой - PullRequest
7 голосов
/ 30 апреля 2010

Я сериализую общий словарь в 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

Ответы [ 2 ]

7 голосов
/ 30 апреля 2010

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

\ 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, версия = 2.0.0.0, культура = нейтральная, 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, версия = 2.0.0.0, культура = нейтральный, 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, версия = 2.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089], [System.Int32, mscorlib, версия = 2.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089]] \ 0 \ 0 \ 0keyvalue \ 0 \ 0 \ Ь \ Ь \ 0 \ 0 \ 0 \ 0 \ v

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

4 голосов
/ 30 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...