Оптимизация сериализации в .NET - Золотые правила оптимизации

ОГЛАВЛЕНИЕ

Золотые правила оптимизации

Здесь приводится список важных советов по оптимизации сериализации:

  1. Знайте, какие у вас данные: Зная ваши данные, как они используются, вероятный диапазон значений, какой диапазон значений возможен и т.д., вы можете определить 'принадлежащие' данные, что поможет вам выбрать подходящие методы (или иначе, чтобы не использовать никакие методы, и сериализовать данные непосредственно в блок SerializationInfo). Всегда есть неоптимизированный метод, доступный для любого простого типа данных, но использование оптимизированной версии дает наилучшие результаты.
  2. Читайте данные в том же порядке, в каком вы их записывали: Потому что мы превращаем данные в потоковые, а не связываем их с именем, поэтому их необходимо повторно считывать в точно таком же порядке, в каком они записывались. Вы не увидите в этом большой проблемы – процесс быстро закончится неудачей, если есть проблема с упорядочиванием, и это выявится во время разработки.
  3. Не сериализуйте что-либо, если в этом нет необходимости: Вы не можете лучше оптимизировать данные, которые занимают ноль байтов! Как пример, смотрите «Методы оптимизации» ниже в этой статье.
  4. Обдумайте, можно ли дочерние объекты считать 'принадлежащими данными': Например, если вы сериализуете коллекцию, и ее содержимое считается частью коллекции, или отдельные объекты сериализованы по отдельности и только снабжены ссылками? Это соображение может сильно повлиять на размер сериализованных данных, поскольку если образец был равен истине, то единственный SerializationWriter эффективно используется многими объектами одновременно, и эффект от разметки строк может быть очень существенным. Как пример, смотрите часть 2 этой статьи.
  5. Помните, что процесс сериализации – это черный ящик: Сериализуемые данные не должны быть в том же формате, что и в памяти. До конца десериализации данные находятся в том же состоянии, что и перед сериализацией, поэтому неважно, что происходит с ними за это время. Для оптимизации нужно сериализовать достаточно данных, чтобы иметь возможность восстановить объекты на другом конце. Как пример, смотрите «Методы оптимизации» позже в этой статье.

Перечисление SerializedType

Таблица ниже показывает используемые в настоящий момент значения SerializedType. 128 зарезервированы для таблиц строк и 70 перечислены ниже, оставляя 58 доступными для другого использования.

NullType

Используется для всех нулевых значений

NullSequenceType

Используется внутренне для идентификации последовательностей нулевых значений в массивах объектов

DBNullType

Используется для всех экземпляров DBNull.Value

DBNullSequenceType

Используется внутренне для идентификации последовательностей DBNull.Value в массивах объектов (DataSet широко используют это значение)

OtherType

Используется для всех неопознанных типов

BooleanTrueType BooleanFalseType

Для логического типа и значений

ByteType SByteType CharType DecimalType DoubleType SingleType Int16Type Int32Type Int64Type UInt16Type UInt32Type UInt64Type

Стандартные типы числовых значений

ZeroByteType ZeroSByteType ZeroCharType ZeroDecimalType ZeroDoubleType ZeroSingleType ZeroInt16Type ZeroInt32Type ZeroInt64Type ZeroUInt16Type ZeroUInt32Type ZeroUInt64Type

Оптимизация хранения числового типа и нулевого значения

OneByteType OneSByteType OneDecimalType OneDoubleType OneSingleType OneInt16Type OneInt32Type OneInt64Type OneUInt16Type OneUInt32Type OneUInt64Type

Оптимизация хранения числового типа и значения один

MinusOneInt16Type MinusOneInt32Type MinusOneInt64Type

Оптимизация хранения числового типа и значения минус один

OptimizedInt32Type OptimizedInt64Type OptimizedInt64Type OptimizedUInt64Type

Сохраняет 32- и 64-битные типы, используя наименьшее возможное число байтов  (смотрите код на предмет наличия ограничений)

EmptyStringType SingleSpaceType SingleCharStringType YStringType NStringType

Оптимизация для эффективного хранения односимвольных строк (1 или 2 байта)

ObjectArrayType ByteArrayType CharArrayType

Оптимизации для обычных типов массивов

DateTimeType MinDateTimeType MaxDateTimeType

Структура DateTime с часто используемыми значениями

TimeSpanType ZeroTimeSpanType

Структура TimeSpan с часто используемыми значениями

GuidType EmptyGuidType

Структура GUID с часто используемыми значениями

BitVector32Type

Оптимизация для хранения BitVector32 в 1 - 4 байтах

DuplicateValueType

Используется внутренне при сохранении пары массивов объектов

BitArrayType

Оптимизация для хранения BitArrays

TypeType

Сохраняет Тип как строку (использует полное AssemblyQualifiedName для несистемных Типов)

SingleInstanceType

Используется внутренне для обозначения, что помеченный объект должен восстанавливаться с помощью Activator.GetInstance()

ArrayListType

Оптимизация для ArrayList