□ Генерировать классы 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
:
// новый Serializer
XmlSerializer newSr=new XmlSerializer(typeof(Products));
// десериализация объекта
newPd=(Products)newSr.Deserialize(f);
// загружаем его в окно списка.
listBox1.Items.Add(newPd.ProductName);
f.Closed();
}
Теперь мы проверим класс Products
. Единственное различие между ним и любым другим классом, который можно записать, состоит в добавленных атрибутах. Не путайте эти атрибуты с атрибутами в документе XML. Эти атрибуты расширяют класс SystemAttribute
. Атрибут является некоторой декларативной информацией, которая может извлекаться во время выполнения с помощью CLR (см. в главе 6 более подробно). В данном случае добавляются атрибуты, которые описывают, как объект должен быть сериализован:
//класс, который будет сериализован,
//атрибуты определяют, как объект сериализуется.
[System.Xml.Serialization.XmlRootAttribute(Namespace='', IsNullable=false)]
public class Products {
[System.Xml.Serialization.XmlElementAttribute(IsNullable=false)]
public int ProductID;
[System.Xml.Serialization.XmlElementAttribute(IsNullable=false)]
public string ProductName;
[System.Xml.Serialization.XmlElementAttribute()]
public int SupplierID;
[System.Xml.Serialization.XmlElementAttribute()]
public int CategoryID;
[System.Xml.Serialization.XmlElementAttribute()]
public string QuantityPerUnit;
[System.Xml.Serialization.XmlElementAttribute()]
public System.Decimal UnitPrice;
[System.Xml.Serialization.XmlElementAttribute()]
public short UnitsInStock;
[System.Xml.Serialization.XmlElementAttribute()]
public short UnitsOnOrder;
[System.Xml.Serialization.XmlElementAttribute()]
public short ReorderLevel;
[System.Xml.Serialization.XmlElementAttribute()]
public bool Discontinued;
}
Созданный документ XML выглядит, как любой другой документ XML, который мы могли бы создать.
<?xml version='1.0' ?>
<Products xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'