XML-документы и сериализация объектов в XML-документ. Условия применения. Шаблон применения.
Extensible Markup Language (XML) — расширяемый язык разметки. Это способ хранения данных в простом текстовом формате, т.е. он может быть прочитан почти на любом компьютере. Документом XML может быть физический файл на компьютере или просто строка в памяти. Например, определить элемент для хранения заголовка книги можно следующим образом:
<book>Tristram Shandy</book>
Элементы также могут содержать в себе другие элементы, так что вы можете модифицировать элемент <book> таким образом, чтобы включить информацию об авторе наряду с заголовком книги в двух подэлементах:
<book>
<title>Tristram Shandy</title>
<author>Lawrence Sterne</author>
</book>
XML-документы могут содержать множество других составных частей; Элементы, текст внутри элементов и атрибуты — все это узлы документа XML(nodes). Один тип узла появляется почти в каждом документе XML. Это объявление XML, и если вы его включаете, оно должно находиться в первом узле документа.
Объявление XML по своему формату подобно элементу, но имеет внутри себя вопросительные знаки и угловые скобки. Оно всегда имеет имя xml и всегда снабжено атрибутом по имени version; в настоящее время единственное допустимое значение для него — "1.0". Простейшая возможная форма XML-объявления такова:
<?xml version="l.0"?>
Данные XML структурированы иерархически. Каждый документ должен иметь единственный корневой элемент, внутри которого содержатся все элементы и текстовые данные. Если на вершине документа находится более одного элемента, то такой документ не считается правильным документом XML. Правильный документ XML:
<?xml version="l.0"?>
<books>
<book>Tristram Shandy</book> <book>Moby Dick</book> <book>Ulysses</book> </books>
Нет ограничений на число подэлементов, которые может содержать элемент. Для правильного документа XML характерно:
1. Иметь один, и только один корневой элемент.
2. Иметь закрывающие дескрипторы для каждого элемента (за исключением сокращенного синтаксиса, упомянутого ранее).
3. Не иметь перекрывающихся элементов — все дочерние элементы должны быть полностью помещены внутри родителя.
4. Иметь все атрибуты, заключенные в скобки.
Сериализация XML – это процесс преобразования открытых свойств и полей объекта в серийный формат XML для хранения и транспортировки. Десериализация пересоздает объект в его исходном состоянии из вывода XML. Сериализацию можно представить в качестве способа сохранения состояния объекта в поток или буфер.
Для передачи данных между объектами и XML требуется сопоставление из конструкций языка программирования в схему XML и из схемы XML в конструкции языка программирования. XmlSerializer (сериализует объект в поток) и связанные инструменты предоставляют мост между данными двумя технологиями во время разработки и выполнения. Во время выполнения экземпляры классов могут быть сериализованы в документы XML, удовлетворяющие заданной схеме. Аналогично, данные документы XML могут быть десериализованы в объекты времени выполнения.
XmlSerializer обеспечивает преимущество работы с классами строгих типов и, в то же время, обеспечивает гибкость XML. С помощью полей или свойств типа XmlElement, XmlAttribute или XmlNode в классах строгих типов можно считывать части документа XML непосредственно в объекты XML.
При работе в расширяемых схемах XML можно также использовать атрибуты XmlAnyElementAttribute и XmlAnyAttributeAttribute для сериализации и десериализации элементов или атрибутов, не обнаруженных в исходной схеме.
Если свойство или поле возвращает сложный объект (например, массив или экземпляр класса), XmlSerializer преобразует его в элемент, вложенный в рамках основного документа XML.
XmlSerializer предоставляет специальную обработку для классов, реализующих IEnumerable или ICollection. Класс, реализующий IEnumerable, должен реализовывать открытый метод Add, принимающий один параметр. Параметр метода Add должен быть того же типа, что и тип, возвращенный из свойства Current по значению, возвращенному из GetEnumerator, или одним из базовых типов. Класс, реализующий ICollection (например, CollectionBase), в дополнение к IEnumerable должен иметь открытое индексированное свойство Item (индексатор в C#), принимающее целое значение, а также должен иметь открытое свойство Count целого типа. Параметр для метода Add должен быть того же типа, что и тип возвращенного значения из свойства Item или быть одним из базовых типов. Для классов, реализующих ICollection, сериализуемые значения извлекаются из индексированного свойства Item, а не путем вызова GetEnumerator.