
- •Язык xml
- •Пространства имён
- •Объектная модель xml документа
- •Перечисление XmlNodeType
- •Класс XmlDocument
- •Использование объектной модели документа
- •Запись xml документа
- •Чтение xml документа
- •Последовательный доступ к xml документу
- •Класс XmlTextWriter
- •Класс XmlTextReader
- •Сериализация (Serialization)
- •Класс из графа объектов
- •Сериализация с помощью XmlSerializer
- •Пример сериализации
- •Результат сериализации
- •Пример десериализации
- •Управление генерируемым xml
- •Использование атрибутов
- •Результат сериализации
- •Использование атрибутов сериализации
- •Сериализация коллекций
- •Десериализация коллекции
Сериализация коллекций
Часто возникает необходимость сериализовать не один объект а целый набор объектов. Это можно легко сделать поместив все необходимые объекты в сериализуемую коллекцию. При сериализации коллекции все объекты в ней также будут сериализованны. Большинство коллекций сериализуемы.
Создаются два объекта класса 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);
}