5) Сериализация / Работа с цветами, кистями, эффектами и прозрачностью в WPF

Сериализация
Сериализация представляет собой процесс преобразования объекта в поток байтов для хранения объекта или передачи его в память, базу данных или файл. Ее основное назначение —сохранить состояние объекта для того, чтобы иметь возможность воссоздать его при необходимости. Обратный процесс называется десериализацией.
Контракт данных – это тип (класс или структура), объект которого описывает инф фрагмент(фрагмент мб сохранен, а затем восстановлен).
Основным форматом хранения контрактов д явлxml. У атрибута [DataMember] есть св-во Name,order(порядок записи э контракта), isrequired (обязательный э для записи), EmitDefaultValue(нужна ли запись значения по умолчанию для э). Если контракт явл
коллекцией объектов (класс Group), он маркируется атрибутом [CollectionDataContract]/ Применимы атрибуты [OnSerializing], [OnSerialized], [OnDeserializing], [OnDeserialized].Атрибут  [KnownType] – контракт планируется десериальзовать в объекты потомков своего типа.Если контракт является коллекцией объектов (как класс Group), он маркируется атрибутом [CollectionDataContract]. Кроме этого, для методов контракта данных применимы атрибуты [OnSerializing], [OnSerialized], [OnDeserializing], [OnDeserialized].
Для сериализации контракта данных используются классы:
1.DataContractSerializer сериализует контракт;
2.NetDataContractSerializer сериализует данные и тип контракта;
3.DataContractJsonSerializer сериализует контракта в формате JSON.Классы, связанные с сериализацией времени выполнения, размещены в пространствах имѐн с префиксом System.Runtime.Serialization.
Сериализация времени выполнения применима только к объектам сериализуемых типов. Сериализуемый тип – это тип, помеченный атрибутом [Serializable] у которого все поля имеют сериализумый тип. Все базовые типы платформы .NET являются сериализуемыми. Если планируется сериализация объекта group, необходимо добавить атрибут [Serializable] к классам Group и Student. Сериализация некоторых полей может не иметь смысла (например, эти поля вычисляются при работе с объектом или хранят конфиденциальные данные). Для таких полей можно применить атрибут [NonSerialized].Сериализуемые типы можно сохранить в поток в различных форматах. Платформа .NET имеет классы, поддерживающие двоичный формат и формата SOAP. Можно создать свой формат. Осуществим сериализацию объекта group в двоичном формате. Используем для этого экземплярный метод Serialize() класса BinaryFormatter.АльтерIDeserializationCallbackявлатрибуты[OnSerializing], [OnSerialized], [OnDeserializing], [OnDeserialized], применимыекметодам. Помеченные методы вызываются авто до и после  сериализации или десериализации. Метод, должен принимать в качестве аргумента объект класса StreamingContext3 и не возвращать значений. Каждый из атрибутов может применяться только к одному методу в типе. Если не устраивает способ организации потока сериализуемых д, можно повлиять на этот процесс, реализуя в сериализуемом типе интерфейс ISerializable. Интерфейс позволяет выполнить любые действия, связанные с формированием данных для сохранения. Метод GetObjectData() вызывается CLR авто привыполнении сериализации. Реализация метода-заполнение объекта SerializationInfo набором данных вида«ключ-значение», которые (обычно) соответствуют полям сохраняемого объекта. Класс SerializationInfo содержит перегруженный метод AddValue(), набор методов вида GetПримитивныйТип(), а также свойства для указания имени типа и сборки сериализуемого  объекта. Если тип реализует интерфейс ISerializable, он должен содержать специальный private-конструктор, который будет вызывать CLR после выполнения десериализации. Конструктор должен иметь параметр типа SerializationInfo и StreamingContext.

Работа с цветами, кистями, эффектами и прозрачностью в WPF
WPF позволяет работать с двумя цветовыми моделями:
1. RGB – распространённая цветовая модель, в которой каждый компонент цвета (красный, зелёный, синий) представлен одним байтом.
2. scRGB – в этой модели каждый компонент цвета (альфа-канал, красный, зелёный, синий) представлен с помощью 16- или 32-битных вещественных чисел в диапазоне от 0 до 1.
Структура System.Windows.Media.Color хранит информацию о цвете. Свойства позволяют прочитать или задать отдельную цветовую компоненту , а статические методы – создать цвет на основе компонент:
Color c1 = Color.FromRgb(10, 20, 30)
Color c2 = Color.FromArgb(250, 10, 20, 32);
Color c4 = (c1 + c2)*2; 
byte red = c4.R;
Класс System.Windows.Media.Colors содержит набор именованных цветов в виде статических свойств для чтения. Класс System.Windows.SystemColors предоставляет аналогичный набор для стандартных цветов системы:
Color c1 = Colors.IndianRed;
Color c2 = SystemColors.ControlColor;
При установке цвета в разметке XAML применяются следующие форматы:
Имя-цвета – одно из имён свойств в классе Colors;
<Button Background="Red" /> <Button Background="#64A" />
Кисть – это объект, используемый для заполнения фона, переднего плана, границы, линии. Любая кисть является потомком абстрактного класса System.Windows.Media.Brush. Имеется несколько стандартных классов
кистей:
1. SolidColorBrush – закрашивает область сплошным цветом;
2. LinearGradientBrush – закрашивает область, используя линейное
градиентное заполнение, изображающее переход от одного цвета к другому;
3. RadialGradientBrush – рисует область, используя радиальный градиент.
4 ImageBrush – рисует область, используя изображение, которое может
растягиваться, масштабироваться или многократно повторяться.
5. VisualBrush – заполняет область, используя объект Visual.
6. DrawingBrush – рисует область, используя объект Drawing.
WPF поддерживает применение к элементам эффектов, таких как размытие или отбрасывание тени. Эффекты описываются классами, унаследованными от System.Windows.Media.Effects.Effect: BlurEffect – эффект размытия;
DropShadowEffect – эффект тени; ShaderEffect –пиксельные шейдеры.
<Button.Effect>
<BlurEffect Radius="2" RenderingBias="Quality" />
</Button.Effect>
В WPF поддерживается истинная прозрачность. Каждый элемент и кисть содержат свойство Opacity, определяющее степень прозрачности и принимающее вещественные значения из диапазона [0, 1], Например, Opacity=0.9 создаёт эффект 90% видимости и 10% прозрачности. Применение OpacityMask с кистями, содержащими градиентный переход от сплошного к прозрачному цвету создаёт эффект постепенного «исчезновения» поверхности.