Разработка приложений на языке C#. Полезные настройки. Особые спецификаторы формата, страница 38

Заметьте, что после того, как список сохранен, прочесть его не составляет особого труда, так как serializer уже настроен на специфику работы с гетерогенным списком. Проверьте работу указанной схемы, обязательно откройте файл List.xml и убедитесь, что теги изменяются в зависимости от реального типа объекта, на который ссылается переменная типа Man.

Рассмотрим еще один, более сложный вариант реализации той же функциональности. Вы должны использовать только один из вариантов. Уберите комплексный атрибут, стоящий в объявлении объекта men класса ArrayList. Теперь его роль будет выполнена объектами других классов: XmlAttributes, XmlElementAttribute и XmlAttributeOverrides.

public static void TestXmlSerializerHetero ()

{

  List list = new List();

  list.Work();       // Здесь следует прочесть список в нашем (текстовом) формате с помощью метода List.Read

   //=== Создадим и настроим объект класса  XmlSerializer для записи гетерогенного списка в формате XML

  XmlAttributes attrs = new XmlAttributes();

  attrs.XmlElements.Add (new XmlElementAttribute ("Stud", typeof(Stud)));

  attrs.XmlElements.Add (new XmlElementAttribute ("Prof", typeof(Prof)));

  XmlAttributeOverrides overrides = new XmlAttributeOverrides();

  overrides.Add (typeof(List), "men", attrs);

  XmlSerializer serializer = new XmlSerializer (typeof(List), overrides);

  TextWriter sw = new StreamWriter ("../../List.xml");

  serializer.Serialize (sw, list);

  sw.Close();

      list.men.Clear();

  FileStream fs = new FileStream("../../List.xml", FileMode.Open);

  list = (List) serializer.Deserialize (fs);

  list.Show();

 }

Как видите, новые классы позволяют уточнить типы сериализуемых данных и сообщить объекту XmlSerializer, что список неоднороден (см. оператор overrides.Add (typeof(List), "men", attrs);).  Проверьте работы этой схемы и убедитесь в том, что она дает тот же результат. Итак, мы увидели, как реализуется полиморфизм в рамках технологии XML. Сравните наш код с тем, который приведен в MSDN по темам: XmlAttributeOverrides Class или Examples of XML Serialization.

Windows-приложение на платформе .NET

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

Класс BindingList<> обладает универсальными возможностями и позволяет оперировать в памяти данными произвольного типа. DataGridView (привязанный к BindingList<>) позволяет не только просматривать данные, но и добавлять новые объекты. Вставка новых объектов невозможна, если привязать DataGridView к данным типизированной коллекции List<Person>, или обобщенной коллекции ArrayList.

Примерный вид главного окна приложения показан ниже. Рассматривая его, вы должны выработать структуру классов и обдумать набор событий, на которые должно откликаться главное окно вашего приложения.

Данные на рисунке не соответствуют действительности (подправьте их, если не трудно). Итак, мы создадим в памяти список объектов класса Person. Он будет хранится с помощью структуры данных, управляемой generic-классом BindingList<Person>. Шаблон (или generic-коллекция BindingList<>) настроена на хранение объектов класса Person. Список находится в памяти, а его данные отображаются в окне компонента DataGridView. Вы можете изменить, как имя класса Person, так и набор его полей, но не снижайте уровень сложности проекта. Для оценки требуемого уровня внимательно рассмотрите рисунок.

На рисунке вы видите: