
- •Язык xml
- •Пространства имён
- •Объектная модель xml документа
- •Перечисление XmlNodeType
- •Класс XmlDocument
- •Использование объектной модели документа
- •Запись xml документа
- •Чтение xml документа
- •Последовательный доступ к xml документу
- •Класс XmlTextWriter
- •Класс XmlTextReader
- •Сериализация (Serialization)
- •Класс из графа объектов
- •Сериализация с помощью XmlSerializer
- •Пример сериализации
- •Результат сериализации
- •Пример десериализации
- •Управление генерируемым xml
- •Использование атрибутов
- •Результат сериализации
- •Использование атрибутов сериализации
- •Сериализация коллекций
- •Десериализация коллекции
Сериализация (Serialization)
Сериализация – это процесс записи состояния объекта в поток. Сохранённая последовательность данных содержит всю необходимую информацию для восстановления состояния объекта в случае необходимости.
С помощью сериализация можно организовать копирование объектов на удалённные машины. По этой причине она широко применяется при вызове удалённых методов и в веб сервисах.
В C# для того чтобы объекты класса могли быть сериализованы достаточно просто связать с ним атрибут [Serializable]. Если какие-то поля класса не должны быть сериализованны необходимо связать с ними атрибут [NonSerialized].
Сериализуемый объект может ссылаться на другие объекты, которые могут ссылаться на другие объекты и так далее. Все такие объекты вместе называются графом связанных объектов. Когда объект сериализуется вместе с ним сериализуется весь граф связанных объектов.
Для различных видов графов связанных объектов возможны различные алгоритмы сериализации. Например, некоторые алгоритмы которые отлично работают с графами связанных объектов деревьями не будут работать с графами связанных объектов содержащими циклы.
Рисунок – Граф связанных объектовэ
Экземпляр класса ArrayList ссылается на два различных экземпляра класса Book. Каждый из экземпляров класса Book ссылается на свой экземпляр класса Pubinfo. В данном случае граф не содержит циклов и вообще представляет из себя дерево. Несложно привести пример, где граф связанных объектов содержит циклы и не является деревом.
Класс из графа объектов
Для демонстрации графа объектов объявляется класс Pubinfo. Он будет использоваться для объявления поля в другом классе Book. В нём всего два поля для издательства и издания. Для простоты они объявлены публичными. В классе объявлен конструктор позволяющий задавать значения этих двух полей. У класса есть атрибут [Serializable]. Без этого атрибута класс не был бы сериализуемым.
[Serializable]
public class Pubinfo
{
public string publisher;
public int edition;
public Pubinfo(){}
public Pubinfo(string publisher, int edition)
{
this.publisher = publisher; this.edition = edition;
}
}
Для демонстрации графа объектов объявляется класс Book. В нём всего три поля два для автора и названия, а третье для информации об издательстве и издании. Для простоты все поля объявлены публичными. В классе объявлен конструктор позволяющий задавать значения полей для автора и названия а также издательство и издание. При создании экземпляра класса Book в конструкторе создаётся экземпляр класса Pubinfo и ссылка на него записывается в поле для информации об издательстве и издании. У класса есть атрибут [Serializable]. Этот атрибут необходим чтобы класс был сериализуемым.
[Serializable]
public class Book
{
public string author;
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);
}
}
Приведён код программы строящей граф объектов. Создаются несколько объектов класса Book с различными значениями полей. При создании экземпляров класса Book в конструкторе создаются экземпляры класса Pubinfo. Все созданные экземпляры класса Book помещаются в один динамический массив. Получается граф объектов. Данный граф объектов является деревом. Корень этого дерева объект для динамического массива. Его потомки это экземпляры класса Book. У каждого экземпляра класса Book есть свой потомок это экземпляр класса Pubinfo.
class Program
{
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);
...
}
}