Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лр4_сериализация.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
306.18 Кб
Скачать

1.3.2. Роль объектных графов.

При сериализации объекта CLR учитывает состояния всех связанных объектов. Множество связанных объектов представляется объектным графом. Объектные графы обеспечивают простой способ учета взаимных связей в множестве объектов, и совсем не обязательно, чтобы эти связи в точности проецировались в классические связи объектно-ориентированного программирования (такие, как отношения наследования или вложенности), хотя они достаточно хорошо моделируют и такую парадигму.

В объектном графе каждому объекту назначается уникальное числовое значение. Однако, следует иметь в виду, что числовые значения, приписываемые членам в объектном графе, являются произвольными и не имеют никакого смыслового значения вне самого графа. После назначения всем объектам числового значения, объектный граф может начать запись множества зависимостей между его объектами.

В качестве простого примера предположим, что создан набор классов, моделирующих автомобили. Существует базовый класс по имени Саr, который "имеет" класс Radio. Другой класс по имени JamesBondCar расширяет базовый тип Саг. На рис.1 показан возможный граф объектов, который моделирует эти отношения.

Рис. 1. Простой граф объектов.

При чтении графов объектов для описания соединяющих стрелок можно использовать выражение "зависит от" или "ссылается на". Таким образом, на рис.1 видно, что класс Саr ссылается на класс Radio (учитывая отношение "имеет"), а класс JamesBondCar ссылается на класс Саr (учитывая отношение "имеет") и на класс Radio (поскольку наследует эту защищенную переменную-член).

Конечно, среда CLR не рисует картинок в своей памяти для представления графа взаимосвязанных объектов. Вместо этого взаимосвязи, указанные в диаграмме, представляются математической формулой, которая выглядит примерно так:

[Саr 3, ref 2], [Radio 2], [JamesBondCar 1, ref 3, ref 2]

Проанализировав эту формулу, можно увидеть, что объект 3 (Саr) имеет зависимость от объекта 2 (Radio). Объект 2 (Radio) является "индивидуалистом", которому не нужен никто. И, наконец, объект 1 (JamesBondCar) имеет зависимость как от объекта 3, так и от объекта 2. В любом случае, при сериализации или десериализации (реконструкция, восстановление) экземпляра типа JamesBondCar, объектный граф гарантирует, что типы Radio и Саr также будут участвовать в процессе.

Изящество процесса сериализации состоит в том, что граф, представляющий отношения между объектами, создается автоматически в фоновом режиме. Если необходимо вмешаться в конструирования графа объектов, то это можно сделать с помощью настройки процесса сериализации через ее атрибуты и интерфейсы.

1.3.3. Настройка объектов для сериализации.

Чтобы сделать объект доступным для служб сериализации .NET, понадобится только декорировать каждый связанный класс (или структуру) атрибутом [Serializable]. Если выясняется, что некоторый тип имеет члены-данные, которые не должны (или не могут) участвовать в схеме сериализации, можно пометить такие поля атрибутом [NonSerialized]. Это помогает сократить размер хранимых данных, при условии, что в сериализуемом классе есть переменные-члены, которые не следует "запоминать" (например, фиксированные значения, случайные значения, кратковременные данные и т.п.).