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

Сериализация (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);

...

}

}