- •Атрибуты в среде .Net и языке c#.
- •Метаданные
- •Понятие атрибутов
- •Предопределенные и собственные атрибуты
- •Потребители атрибутов
- •Применение атрибутов
- •Сокращенное именование атрибутов
- •Создание собственных атрибутов:
- •Применение собственных атрибутов:
- •Ограничение использования атрибутов:
- •Атрибуты уровня сборки и модуля:
- •Рефлексия атрибутов:
- •Выводы:
- •Язык xml. Классы платформы .Net для работы с xml-данными.
- •Синтаксис xml
- •Работа с xml при помощи System.Xml
- •Работа с xml при помощи linq to xml
- •Выводы:
- •Потоковый ввод-вывод. Файлы. Работа с файлами и каталогами. Пространство имен System.Io
- •Классы Directory (DirectoryInfo) и File (FileInfo) Некоторые общие свойства классов DirectoryInfo и FileInfo:
- •Дополнительные возможности класса DirectoryInfo
- •Дополнительные возможности класса FileInfo
- •Дополнительные члены File
- •Потоковый ввод-вывод
- •Работа с классом FileStream
- •Работа с классами StreamWriter и StreamReader
- •Классы StringWriter и StringReader
- •Работа с классами BinaryWriter и BinaryReader
- •Выводы:
- •Сериализация. Атрибуты. Стандартные форматы сериализации. Понятие сериализации объектов
- •Роль графов объектов
- •Конфигурирование объектов для сериализации
- •Общедоступные поля, приватные поля и общедоступные свойства
- •Стандартные форматеры сериализации
- •Настройка сериализации с использованием атрибутов
- •Выводы:
- •Понятие бд и субд. Язык sql. Ado.Net как средство доступа из c# к субд. Понятие бд
- •Понятие субд
- •Обзор синтаксиса
- •Подключенный уровень
- •Автономный уровень
- •Основные свойства класса DataSet
- •Основные методы класса DataSet
- •Типы DataColumn и DataRow
- •Основные члены типа DataColumn:
- •Основные члены типа DataRow:
- •Работа с адаптерами данных:
- •Основные члены класса DbDataAdapter:
- •Параллельные вычисления. Многозадачность и многопоточность.
- •Некоторые члены класс Process:
- •Некоторые члены класса ProcessThread
- •Домены приложений
- •Некоторые члены класс AppDomain:
- •Многопоточность. Классификация состояний потока. Средства многопоточного программирования System.Threading.
- •Некоторые члены пространства имен System.Threading
- •Основные члены класс Thread
- •Состояния потока
- •Многопоточное программирование при помощи асинхронных вызовов делегатов
- •Создание вторичных потоков при помощи Thread.Start()
- •Синхронизация с помощью lock
- •Синхронизация с использованием типа System.Threading.Monitor
- •Синхронизация с использованием типа System.Threading.Interlocked
- •Синхронизация с использованием атрибута [Synchronization]
- •Использование System.Threading.Timer
- •Пул потоков clr
- •Библиотека Windows.Forms. Пространства имен. Структура приложения. Элементы управления. События. Иерархия элементов управления.
- •Основные пространства имен Windows Forms
- •Структура приложения WinForms
- •Элементы управления
- •События
- •Библиотека wpf. Отличия wpf от WindowsForms. Разметка xaml. Понятие Windows Presentation Foundation
- •Типы приложений wpf
- •Основные сборки wpf
- •Построение приложения wpf без xaml
- •Построение приложения wpf с использованием только xaml
- •Пример c# обработчика события для контрола, объявленного в xaml (связь кода и xaml):
- •Создание проекта
- •Знакомство с инструментами визуального конструктора wpf
Роль графов объектов
При сериализации среда CLR учитывает все связанные объекты, чтобы гарантировать корректное сохранение данных. Этот набор связанных объектов называется графом объектов.
В качестве простого примера предположим, что создан набор классов, моделирующих автомобили. Существует базовый класс по имени Car, который "имеет" класс Radio. Другой класс по имени JamesBondCar расширяет базовый тип Car. На рисунке показан возможный граф объектов, который моделирует эти отношения.
При чтении графов объектов для описания соединяющих стрелок можно использовать выражение "зависит от" или "ссылается на". Таким образом, видно, что класс Car ссылается на класс Radio, JamesBondCar ссылается на Car (наследует), и на Radio (имеет).
В результате построения графа при сериализации или десериализации JamesBondCar граф объектов гарантирует, что типы Radio и Car также будут участвовать в процессе.
Граф, представляющий отношения между объектами, устанавливается автоматически, если необходимо вмешаться в конструирование графа объектов, это можно сделать посредством настройки процесса сериализации через атрибуты и интерфейсы.
Конфигурирование объектов для сериализации
Чтобы сделать объект доступным для служб сериализации .NET, нужно декорировать каждый связанный класс (или структуру) атрибутом [Serializable].
Если выясняется, что некоторый тип имеет члены-данные, которые не должны (или не могут) участвовать в схеме сериализации (например, фиксированные значения, случайные значения, кратковременные данные и т.п.), можно пометить такие поля атрибутом [NonSerialized].
Атрибут [Serializable] не может наследоваться от родительского класса. Поэтому при наследовании типа, помеченного [Serializable], дочерний класс также должен быть помечен [Serializable] или же его нельзя будет сохранить в потоке. Фактически все объекты в графе объектов должны быть помечены атрибутом [Serializable]. Попытка сериализовать несериализуемый объект с использованием BinaryFormatter или SoapFormatter приводит к исключению SerializationException во время выполнения.
Общедоступные поля, приватные поля и общедоступные свойства
Если состояние объекта сохраняется с использованием BinaryFormatter или SoapFormatter, то видимость полей класса не имеет значения. Эти типы могут сериализовать любые данные класса, независимо от того, представлены они общедоступными (public) полями, приватными (private) полями или приватными полями с соответствующими общедоступными свойствами.
Однако при использовании XmlSerializer будут сериализоваться только сериализуемые общедоступные поля данных или приватные поля, представленные общедоступными свойствами. Приватные данные, не представленные свойствами, просто игнорируются. Например для класса
[Serializable]
public class Person
{
// Общедоступное поле.
public bool isAlive = true;
// Приватное поле.
private int personAge = 21;
// Общедоступное свойство/приватные данные.
private string fName = string.Empty;
public string FirstName
{
get { return fName; }
set { fName = value; }
}
}
При обработке BinaryFormatter или SoapFormatter обнаружится, что поля isAlive, personAge и fName сохраняются в выбранном потоке. Однако XmlSerializer не сохранит значения personAge, поскольку эта часть приватных данных не инкапсулирована в свойство.