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

Управление генерируемым 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>