
- •Язык xml
- •Пространства имён
- •Объектная модель xml документа
- •Перечисление XmlNodeType
- •Класс XmlDocument
- •Использование объектной модели документа
- •Запись xml документа
- •Чтение xml документа
- •Последовательный доступ к xml документу
- •Класс XmlTextWriter
- •Класс XmlTextReader
- •Сериализация (Serialization)
- •Класс из графа объектов
- •Сериализация с помощью XmlSerializer
- •Пример сериализации
- •Результат сериализации
- •Пример десериализации
- •Управление генерируемым xml
- •Использование атрибутов
- •Результат сериализации
- •Использование атрибутов сериализации
- •Сериализация коллекций
- •Десериализация коллекции
Управление генерируемым xml
Существует много вариантов записи состояния объекта в XML. Например, значения полей можно записывать как текст внутри элементов или как значения атрибутов в тегах. Элементы могут называться по-разному. Могут использоваться различные пространства имён. Сериализация по умолчанию это всего лишь один вариант сериализации.
С помощью атрибутов можно управлять сериализацией объекта в XML. Например, можно указать другое имя для XML элемента, использовать для сериализации значений атрибуты тега, а не элементы или использовать какое-то специальное пространство имён.
Таблица – Атрибуты сериализации
Использование атрибутов
Используются два атрибута: XmlRoot для указания пространства имён и XmlAttribute для того чтобы поле было сериализованно с использованием атрибута. Пространство имён документа в полученном XML будет http://BookCompany. Значение поля title будет сериализованно как атрибут.
[Serializable, XmlRoot(Namespace = "http://BookCompany")]
public class Book
{
public string author;
[XmlAttribute]
public string title;
public Pubinfo info;
public Book() { }
public Book(string author, string title, string publisher, int edition)
{
this.author = author; this.title = title;
info = new Pubinfo(publisher, edition);
}
public override string ToString()
{
return String.Format("Автор : {0} \nНазвание : {1} \nИздательство : {2}
\nИздание : {3}", author, title, info.publisher, info.edition);
}
}
Результат сериализации
Для управления генерацией XML использовались атрибуты. Значение поля title было сериализованно с помощью атрибута а не в элементе. Пространство имён документа было задано http://BookCompany. На самом деле лучше не использовать атрибуты для хранения информации за исключением уникального идентификационного номера.
<?xml version="1.0" ?>
<Book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
title=".NET Framework"
xmlns="http://BookCompany">
<author>Richter</author>
<info>
<publisher>Microsoft Press</publisher>
<edition>2</edition>
</info>
</Book>
Использование атрибутов сериализации
Для управления сериализацией и десериализацией могут использоваться атрибуты. С помощью атрибутов можно указать какие методы будут вызываться во время сериализации, после сериализации, во время десериализации и после десериализации.
Таблица – Атрибуты сериализации
К методу OnAnything применяются сразу два атрибута [OnSerializing] и [OnDeserialized]. Это означает что эта функция будет вызываться и при сериализации и при десериализации. Внутри эта функция переставит наоборот строки в полях author и title используя вспомогательную функцию для перстановки строк reverse. Ничто не мешает применять атрибуты [OnSerializing] и [OnDeserialized] к различным функциям.
[Serializable]
public class Book
{
public string author; public string title;
public Book() { }
public Book(string a, string t){ this.author = a; this.title = t; }
public override string ToString()
{
return String.Format("Автор : {0} \nНазвание : {1}", author, title);
}
static string reverse(string s)
{
char[] chars = s.ToCharArray();
Array.Reverse(chars);
return new string(chars);
}
[OnSerializing] [OnDeserialized]
internal void OnAnything(StreamingContext context)
{
author = reverse(author); title = reverse(title);
}
}
Сериализован модифицированный класс Book. В этом классе была определена функция для перестановки значений полей author и title в обратном порядке при сериализации. Действительно значения полей author и title переставлены в обратном порядке.
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<a1:Book id="ref-1" xmlns:a1="...">
<author id="ref-3">rethciR</author>
<title id="ref-4">krowemarF TEN.</title>
</a1:Book>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>