День сто пятьдесят пятый. #ЗаметкиНаПолях

Сериализация. Продолжение

Управление сериализацией и десериализацией

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

- поле содержит информацию, становящуюся недействительной после десериализации (указатель, дескриптор или некоторую другую структуру данных, специфичную для конкретной среды);

- поле содержит легко обновляемую информацию (которую легко восстановить без десериализации).

Для восстановления такой информации, а также, если необходимо выполнить какие-либо другие действия при сериализации/десериализации, в типе можно определить методы, помеченные атрибутами OnSerializing, OnSerialized, OnDeserializing, OnDeserialized:

[OnDeserialized]

private void OnDeserialized(StreamingContext context) { … }

Если после сериализации к типу было добавлено поле, десериализация экземпляра выбросит исключение. В этом случае к новому полю можно добавить атрибут OptionalField. Тогда при десериализации в случае отсутствия данных для этого поля исключения выброшено не будет.



StreamingContext

Это структура, имеющая два открытых свойства только для чтения.

1. Context – ссылка на объект типа object, содержащий нужный пользователю контекст (используется при переопределении объектов форматирования, реализующих IFormatter).

2. State – набор битовых флагов, указывающих источник или приёмник сериализуемых/десериализуемых данных:

- CrossProcess – другой процесс на той же машине;

- CrossMachines – источник/приёмник - другая машина;

- File – источник/приёмник – файл (десериализовать, возможно, будет другой процесс);

- Persistence - источник/приёмник – база данных;

- Remoting – данные являются удалёнными по отношению к текущему контексту;

- Other - источник/приёмник неизвестны;

- Clone – точное копирование объекта (об этом далее);

- CrossAppDomain - источник/приёмник – другой домен приложений;

- All - источник/приёмник – любой контекст (по умолчанию).



Окончание следует…



Источник: Джеффри Рихтер “CLR via C#”. 3-е изд. – СПб.: Питер, 2012. Глава 24.