Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сериализация, XML.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
928.26 Кб
Скачать

Сериализация коллекций

Часто возникает необходимость сериализовать не один объект а целый набор объектов. Это можно легко сделать поместив все необходимые объекты в сериализуемую коллекцию. При сериализации коллекции все объекты в ней также будут сериализованны. Большинство коллекций сериализуемы.

Создаются два объекта класса Book. Они помещаются в динамический массив. Для сериализации динамического массива хранящего объекты класса Book создаётся экземпляр класса форматтера XmlSerializer. В конструктор передаются все типы которые могут встретиться в графе объектов: Book и Pubinfo. Открывается файл "Book.xml", возвращается файловый поток. Граф объектов сериализуется в этот файловый поток. Файловый поток закрывается.

static void Main()

{

ArrayList books = new ArrayList();

Book book = new Book("Richter", ".NET Framework", "Microsoft Press",2);

books.Add(book);

Book anotherbook = new Book("Richter", "CLR via C#", "Microsoft Press", 1);

books.Add(anotherbook);

XmlSerializer serializer = new XmlSerializer(typeof(ArrayList)

, new Type[] { typeof(Book),typeof(Pubinfo) });

FileStream fStream = new FileStream("Book.xml", FileMode.Create, FileAccess.Write

, FileShare.None);

serializer.Serialize(fStream, books);

fStream.Close();

Console.WriteLine("Записали набор книг в формате XML.");

}

Все данные сериализованны с помощью элементов. Фактически структура документа соответствует графу объектов. Элементы для потомков в графе объектов находятся внутри элементов для родителей. Для динамического массива используется элемент <ArrayOfAnyType>. Поскольку в динамическом массиве могут хранится экземпляры любых типов для экземпляров класса Book используются элементы <anyType> атрибут type которого равен "Book". Внутри элементов для экземпляров Book названия элементов соответствуют названиям полей.

<?xml version="1.0" ?>

<ArrayOfAnyType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<anyType xsi:type="Book">

  <author>Richter</author>

  <title>.NET Framework</title>

<info>

  <publisher>Microsoft Press</publisher>

  <edition>2</edition>

  </info>

  </anyType>

<anyType xsi:type="Book">

  <author>Richter</author>

  <title> CLR via C#</title>

<info>

  <publisher>Microsoft Press</publisher>

  <edition>1</edition>

  </info>

  </anyType>

</ArrayOfAnyType>

Десериализация коллекции

Для десериализации динамического массива хранящего объекты класса Book создаётся экземпляр класса форматтера XmlSerializer. В конструктор передаются все типы которые могут встретиться в графе объектов: Book и Pubinfo. Открывается файл "Book.xml", возвращается файловый поток. Граф объектов десериализуется из этого файлового потока. Используется приведение типов чтобы привести Object к ArrayList. Все объекты класса book из динамического массива выводятся на экран. Поток закрывается.

static void Main()

{

XmlSerializer serializer = new XmlSerializer(typeof(ArrayList)

, new Type[] { typeof(Book), typeof(Pubinfo) });

Stream fStream = File.OpenRead("Books.xml");

ArrayList books = (ArrayList) serializer.Deserialize(fStream);

fStream.Close();

foreach (Book book in books)

Console.WriteLine(book);

}

18