День сто пятьдесят пятый. #ЗаметкиНаПолях
Сериализация. Продолжение
Управление сериализацией и десериализацией
После назначения типу атрибута
- поле содержит информацию, становящуюся недействительной после десериализации (указатель, дескриптор или некоторую другую структуру данных, специфичную для конкретной среды);
- поле содержит легко обновляемую информацию (которую легко восстановить без десериализации).
Для восстановления такой информации, а также, если необходимо выполнить какие-либо другие действия при сериализации/десериализации, в типе можно определить методы, помеченные атрибутами
StreamingContext
Это структура, имеющая два открытых свойства только для чтения.
1. Context – ссылка на объект типа
2. State – набор битовых флагов, указывающих источник или приёмник сериализуемых/десериализуемых данных:
- CrossProcess – другой процесс на той же машине;
- CrossMachines – источник/приёмник - другая машина;
- File – источник/приёмник – файл (десериализовать, возможно, будет другой процесс);
- Persistence - источник/приёмник – база данных;
- Remoting – данные являются удалёнными по отношению к текущему контексту;
- Other - источник/приёмник неизвестны;
- Clone – точное копирование объекта (об этом далее);
- CrossAppDomain - источник/приёмник – другой домен приложений;
- All - источник/приёмник – любой контекст (по умолчанию).
Окончание следует…
Источник: Джеффри Рихтер “CLR via C#”. 3-е изд. – СПб.: Питер, 2012. Глава 24.
Сериализация. Продолжение
Управление сериализацией и десериализацией
После назначения типу атрибута
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.