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

ЖАНРЫ

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

Ватсон Карли

Шрифт:

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

 // создать новые объекты книги и книжной продукции

 Product newProd=new Product;

 BookProduct newBook=new BookProduct;

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

 newProd.ProductID=100;

 newProd.ProductName="Product Thing";

 newProd.SupplierID=10;

 newBook.ProductID=101;

 newBook.ProductName="How to Use Your New Product Thing";

 newBook.SupplierID=10;

 newBook.ISBN="123456789";

 //поместить
элементы в массив

 Product[] addProd={newProd, newBook};

 // новый объект Inventory с помощью массива addProd

 Inventory inv=new Inventory;

 inv.InventoryItems=addProd;

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

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

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

 sr.Serialize(tr, inv);

 tr.Close;

}

Отметим в событии

button2_Click
, что мы просматриваем массив во вновь созданном объекте
newInv
, чтобы показать, что это те же данные:

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

 Inventory newInv;

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

 XmlSerializer newSr=new XmlSerializer(typeof{Inventory));

 newInv=(Inventory)newSr.Deserialize(f);

 foreach(Product prod in newInv.Inventory Items) listBox1.Items.Add(prod.ProductName);

 f.Close;

}

public class inventory {

 private Product[] stuff;

 public Inventory {}

Мы имеем

XmlArrayItem
для каждого типа, который может быть добавлен в массив. Первый параметр определяет имя элемента в создаваемом документе XML. Если опустить этот параметр
ElementName
, то элементы получат имя типа объекта (в данном случае
Product
и
BookProduct
). Существует также класс
XmlArrayAttribute
, который будет использоваться, если свойство возвращает массив объектов или примитивных типов. Так как мы возвращаем в массиве различные типы, то используется объект
XmlArrayItemAttribute
, который предоставляет более высокий уровень управления:

 // необходимо иметь запись атрибута для каждого типа данных

 [XmlArrayItem("Prod", typeof(Product)), XmlArrayItem("Book", typeof(BookProduct))]

 //public Inventory(Product [] InventoryItems) {

 // stuff=InventoryItems;

 //}

 public Product[] InventoryItems {

get {return stuff;}

set {stuff=value;}

 }

}

//класс Product

public class Product {

 private int prodId;

 private string prodName;

 private int suppId;

 public Product {}

 public int ProductID {

get {return prodId;}

set {prodId=value;}

 }

 public string ProductName {

get {return prodName;}

set {prodName=value;}

 }

 public int SupplierID {

get {return suppId;}

set {suppId=value;}

 }

}

//
Класс Bookproduct

public class BookProduct: Product {

 private string isbnNum;

 public BookProduct {}

 public string ISBN {

get {return isbnNum;}

set {isbnNum=value;}

 }

}

В этот пример добавлено два новых класса. Класс

Inventory
будет отслеживать то, что добавляется на склад. Можно добавлять продукцию на основе класса
Product
или класса
BookProduct
, который расширяет
Product
. В классе
Inventory
содержится массив добавленных объектов и в нем могут находиться как
BookProducts
, так и
Products
. Вот как выглядит документ XML:

<?xml version="1.0" ?>

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

 <InventoryItems>

<Prod>

<ProductID>100</ProductID>

<ProductName>Product Thing</ProductName>

<SupplierID>10</SupplierID>

</Prod>

<Book>

<ProductID>101</ProductID>

<ProductName>How to Use Your New Product Thing</ProductName>

<SupplierID>10</SupplierID>

<ISBN>123456789</ISBN>

</Book>

 </InventoryItems>

</Inventory>

Все это работает прекрасно, но как быть в ситуации, когда нет доступа к исходному коду типов, которые будут сериализироваться? Невозможно добавить атрибут, если отсутствует исходный код. Существует другой способ. Можно воспользоваться классами

XmlAttributes
и
XmlAtrtributeOverrides
. Вместе эти классы позволят выполнить в точности то, что только что было сделано, но без добавления атрибутов. Вот пример, находящийся в папке
SerialSample4
:

Поделиться с друзьями: