Оптимизация сериализации в .NET - Золотые правила оптимизации
ОГЛАВЛЕНИЕ
Золотые правила оптимизации
Здесь приводится список важных советов по оптимизации сериализации:
- Знайте, какие у вас данные: Зная ваши данные, как они используются, вероятный диапазон значений, какой диапазон значений возможен и т.д., вы можете определить 'принадлежащие' данные, что поможет вам выбрать подходящие методы (или иначе, чтобы не использовать никакие методы, и сериализовать данные непосредственно в блок SerializationInfo). Всегда есть неоптимизированный метод, доступный для любого простого типа данных, но использование оптимизированной версии дает наилучшие результаты.
- Читайте данные в том же порядке, в каком вы их записывали: Потому что мы превращаем данные в потоковые, а не связываем их с именем, поэтому их необходимо повторно считывать в точно таком же порядке, в каком они записывались. Вы не увидите в этом большой проблемы – процесс быстро закончится неудачей, если есть проблема с упорядочиванием, и это выявится во время разработки.
- Не сериализуйте что-либо, если в этом нет необходимости: Вы не можете лучше оптимизировать данные, которые занимают ноль байтов! Как пример, смотрите «Методы оптимизации» ниже в этой статье.
- Обдумайте, можно ли дочерние объекты считать 'принадлежащими данными': Например, если вы сериализуете коллекцию, и ее содержимое считается частью коллекции, или отдельные объекты сериализованы по отдельности и только снабжены ссылками? Это соображение может сильно повлиять на размер сериализованных данных, поскольку если образец был равен истине, то единственный SerializationWriter эффективно используется многими объектами одновременно, и эффект от разметки строк может быть очень существенным. Как пример, смотрите часть 2 этой статьи.
- Помните, что процесс сериализации – это черный ящик: Сериализуемые данные не должны быть в том же формате, что и в памяти. До конца десериализации данные находятся в том же состоянии, что и перед сериализацией, поэтому неважно, что происходит с ними за это время. Для оптимизации нужно сериализовать достаточно данных, чтобы иметь возможность восстановить объекты на другом конце. Как пример, смотрите «Методы оптимизации» позже в этой статье.
Перечисление 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 |