Чтение онлайн

на главную - закладки

Жанры

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

После того как

DiffGram
считан в
DataTable
, он оказывается в состоянии, в котором он был бы после выполнения изменений в данных перед вызовом
AcceptChanges
. В этом месте можно на самом деле откатить изменения, вызывая метод
RejectChanges
. Проверяя свойство
DataRow.Item
и передавая либо
DataRowVersion.Original
, либо
DataRowVersion.Current
, можно увидеть значения в
DataTable
перед и после изменений.

Сериализация объектов в XML

Сериализация

является процессом сохранения объекта на диске. Другая часть приложения или даже другое приложение могут десериализовать объект и он будет в том же состоянии, в каком он был до сериализации. Платформа .NET содержит два способа выполнения сериализации. Рассмотрим пространство имен
System.Xml.Serialization
.

Как показывает имя, сериализация производится в формате XML. Это делается преобразованием открытых свойств объекта и открытых полей в элементы и/или атрибуты. Сериализатор XML не может преобразовать скрытые данные, а только открытые. Представляйте это как способ сохранения состояния объекта. Если необходимо сохранить скрытые данные, то используйте

BinaryFormatter
в пространстве имен
System.Runtime.Serialization.Formatters.Binary
. Можно также:

□ Определить, должны ли данные быть атрибутом или элементом.

□ Определить пространство имен.

□ Изменить имя атрибута или элемента.

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

System.Runtime.Serialization.Formatters.Binary
.

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

XmlElement
и
XmlAttribute
. Связью между объектом и документом XML являются специальные атрибуты, которые аннотируют классы. Эти атрибуты используются для того, чтобы информировать сериализатор, как записать данные.

На платформе .NET существует инструмент, помогающий создавать атрибуты,— это утилита

xsd.exe
, которая может делать следующее:

□ Генерировать схему XML из файла схемы XDR

□ Генерировать схему XML из файла XML

□ Генерировать классы

DataSet
из файла схемы XSD

□ Генерировать классы времени выполнения, которые имеют специальные атрибуты для

XmlSerilization

□ Генерировать XSD из классов, которые уже были разработаны

□ Ограничивать список элементов, которые создаются в коде

□ Определять, на каком языке программирования должен быть представлен генерируемый код (C#, VB.NET, или JScript.NET)

□ Создавать схемы из типов в компилированных сборках

В документации платформы можно найти подробное описание параметров командной строки.

Несмотря на предлагаемые возможности, вовсе не обязательно использовать

xsd.exe
, чтобы создать классы для сериализации. Рассмотрим простое приложение, которое сериализует класс, считывающий данные о продуктах, сохраненных ранее в этой главе (пример находится в папке
SerialSample1
). В начале идет очень простой код, который создает новый объект
Product
,
pd
,
и записывает некоторые данные:

private void button1_Click(object sender, System.EventArgs e) {

 // новый объект Products

 Products pd=new Products;

 // задать некоторые свойства

 pd.ProductXD=200;

 pd.CategoryID=100;

 pd.Discontinued=false;

 pd.ProductName="Serialize Objects";

 pd.QuantityPerUnit="6";

 pd.ReorderLevel=1;

 pd.SupplierID=1;

 pd.UnitPrice=1000;

 pd.UnitsInStock=10;

 pd.UnitsOnOrder=0;

Метод

Serialize
класса
XmlSerializer
имеет шесть перегружаемых версий. Одним из требуемых параметров является поток для записи в него данных. Это может быть
Stream
,
TextWriter
или
XmlWriter
. В данном случае мы создали объект
tr
на основе
TextWriter
. Затем необходимо создать объект
sr
на основе
XmlSerializer
.
XmlSerializer
должен знать информацию о типе сериализуемого объекта, поэтому используется ключевое слово
typeof
с указанием типа, который должен быть сериализован. После создания объекта
sr
вызывается метод
Serialize
, в который передается
tr
(объект на основе
Stream
) и объект, который необходимо сериализовать, в данном случае
pd
. Не забудьте закрыть поток, когда закончите с ним работу.

 //новый TextWriter и XmlSerializer

 TextWriter tr=new StreamWriter("..\\..\\..\\serialprod.xml");

 XmlSerializer sr=new XmlSerializer(typeof(Products));

 // сериализуем объект

 sr.Serialize(tr,pd);

 tr.Close;

}

Здесь мы добавляем событие другой кнопки для создания нового объекта

newPd
на основе
Products
. В этот раз мы будем использовать объект
FileStream
для чтения XML:

private void button2_Click(object sender, System.EventArgs e) {

 // создаем ссылку на тип Products Products newPd;

 // новый файловый поток для открытия сериализованного объекта

 FileStream f=new FileStream("..\\..\\..\\serialprod.xml", FileMode.Open);

Здесь создается новый объект

XmlSerializer
, таким образом передается информация о типе
Product
. Затем можно вызвать метод
Deserialize
. Отметим, что нам по-прежнему необходимо делать явное преобразование типа, когда создается объект
newPd
. В этом месте newPd имеет такое же состояние, как и
pd
:

Поделиться:
Популярные книги

Мастер 10

Чащин Валерий
10. Мастер
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер 10

Черный Маг Императора 5

Герда Александр
5. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 5

Проводник

Кораблев Родион
2. Другая сторона
Фантастика:
боевая фантастика
рпг
7.41
рейтинг книги
Проводник

Возвращение демонического мастера. Книга 6

Агафонов Антон Романович
6. Вселенная Вечности
Фантастика:
фэнтези
5.00
рейтинг книги
Возвращение демонического мастера. Книга 6

Отмороженный 11.0

Гарцевич Евгений Александрович
11. Отмороженный
Фантастика:
боевая фантастика
рпг
попаданцы
фантастика: прочее
фэнтези
5.00
рейтинг книги
Отмороженный 11.0

Лорд Системы

Токсик Саша
1. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
4.00
рейтинг книги
Лорд Системы

Неправильный солдат Забабашкин

Арх Максим
1. Неправильный солдат Забабашкин
Фантастика:
попаданцы
альтернативная история
5.62
рейтинг книги
Неправильный солдат Забабашкин

Газлайтер. Том 16

Володин Григорий Григорьевич
16. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 16

Мл. сержант. Назад в СССР. Книга 3

Гаусс Максим
3. Второй шанс
Фантастика:
альтернативная история
6.40
рейтинг книги
Мл. сержант. Назад в СССР. Книга 3

Бестужев. Служба Государевой Безопасности. Книга 5

Измайлов Сергей
5. Граф Бестужев
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга 5

Господин следователь. Книга 2

Шалашов Евгений Васильевич
2. Господин следователь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Господин следователь. Книга 2

На границе империй. Том 9. Часть 3

INDIGO
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 3

Разбуди меня

Рам Янка
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Разбуди меня

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II