Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)






Сериализация с помощью XmlSerializer



Форматтер XmlSerializer может использоваться для записи состояния объекта в XML документ. Во время создания этому форматтеру необходимо передать массив всех типов которые могут присутствовать в графе объектов. Кроме того все сериализуемые типы в графе объектов должны иметь конструктор без параметров. Данный форматтер не может быть использован для сериализации графа объектов содержащего циклы.

Класс XmlSerizlier предоставляет методы для сериализации и десериализации полного граф связанных объектов в документы XML и из них.

public class XmlSerializer

{

public XmlSerializer(Type type, Type[] extraTypes);

public Object Deserialize( Stream stream);

public void Serialize(Stream stream, object o);

}

Методы класса XmlSerializer

Пример сериализации

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

static void Main()

{

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

XmlSerializer serializer = new XmlSerializer(typeof(Book)

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

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

,FileAccess.Write, FileShare.None);

serializer.Serialize(fStream, book);

fStream.Close();

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

}

Результат сериализации

Все данные сериализованны с помощью элементов. Фактически структура документа соответствует графу объектов. Элементы для потомков в графе объектов находятся внутри элементов для родителей. Название корневого элемента совпадает с названием типа для корня в графе объектов. Названия элементов соответствуют названиям полей. Формат очень простой. Подобную сериализацию легко выполнить с помощью рекурсии. Но сразу видно, что попытка сериализовать граф объектов с циклами может привести к бесконечному количеству вложенных элементов.

<?xml version="1.0" ?>

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

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

<author>Richter</author>

<title>.NET Framework</title>



<info>

<publisher>Microsoft Press</publisher>

<edition>2</edition>

</info>

</Book>

Пример десериализации

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

static void Main()

{

XmlSerializer serializer = new XmlSerializer(typeof(Book)

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

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

Book newbook = (Book) serializer.Deserialize(fStream);

fStream.Close();

 

Console.WriteLine(newbook);

}

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


Эта страница нарушает авторские права

allrefrs.ru - 2019 год. Все права принадлежат их авторам!