Вход/Регистрация
C# для профессионалов. Том II
вернуться

Ватсон Карли

Шрифт:

}

Это тот же пример, что и раньше, но первое, что необходимо заметить,— здесь нет добавленных в класс

Inventory
атрибутов. Поэтому в данном случае представьте, что классы
Inventory
,
Product
и производный класс
BookProduct
находятся в отдельной DLL, и у нас нет исходного кода.

Первым шагом в процессе является создание объекта на основе

XmlAttributes
, и объекта
XmlElementAttribute
для каждого типа данных, который будет переопределяться:

XmlAttributes attrs=new XmlAttributes;

attrs.XmlElements.Add(new XmlElementAttribute("Book", typeof(BookProduct)));

attrs.XmlElements.Add(new XmlElementAttribute("Product", typeof(Product)));

Здесь мы добавляем новый

XmlElementAttribute
к коллекции
XmlElements
класса
XmlAttributes
. Класс
XmlAttributes
имеет свойства, соответствующие атрибутам, которые могут применяться;
XmlArray
и
XmlArrayItems
, которые мы видели в предыдущем примере, являются только парой. Теперь мы имеем объект
XmlAttributes
с двумя объектами на основе
XmlElementAttribute
, добавленными к коллекции
XmlElements
. Далее создадим объект
XmlAttributeOverrides
:

XmlAttributeOverrides attrOver = new XmlAttributeOverride;

attrOver.Add(typeof(Inventory) , "Inventory Items", attrs);

Meтод

Add
имеет две перегружаемые версии. Первая получает информацию о типе переопределяемого объекта и объект
XmlAttributes
, который был создан ранее. Вторая версия та, что мы используем, получает также с строковое значение, которое является членом в переопределенном объекте. В нашем случае мы хотим переопределить член
InventoryItems
в классе
Inventory
.

Теперь создадим объект

XmlSerializer
, добавляя объект
XmlAttributeOverrides
в качестве параметра.
XmlSerializer
уже знает, какие типы мы хотим переопределить и что нам нужно вернуть для этих типов. Если выполнить метод
Serialize
, то получится следующий вывод XML:

<?xml version="1.0"?>

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

 <Products>

<ProductID>100</ProductID>

<ProductName>Product Thing</ProductName>

<SupplierID>10</SupplierID>

 </Product>

 <Book>

<ProductID>101</ProductID>

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

<SupplierID>10</SupplierID>

<ISBN>123456789</ISBN>

 </Book>

</Inventory>

Мы получили тот же самый XML, что и в предыдущем примере. Чтобы десериализовать этот объект и воссоздать объект на основе Inventory, с которого мы начали, необходимо создать все те же объекты

XmlAttributes
,
XmlElementAttribute
и
XmlAttributeOverrides
, которые создаются при сериализации объекта. Когда это будет сделано, можно прочитать XML и воссоздать объект
Inventory
, как это делалось раньше. Вот код для десериализации объекта
Inventory
:

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

 XmlAttributes attrs=new XmlAttributes;

 attrs.XmlElements.Add(new XmlElementAttribute("Book", typeof(BookProduct)));

 attrs.XmlElements.Add(new XmlElementAttribute("Product", typeof(Product)));

 XmlAttributeOverrides attrOver=new XmlAttributeOverrides;

 attrOver.Add(typeof(Inventory), "InventoryItems", attrs);

 Inventory newInv;

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

 XmlSerializer newSr=new XmlSerializer(typeof(Inventory), attrOver);

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

 foreach(Product prod, in newInv.InventoryItems) listBox1.items.Add(prod.ProductName);

 f.Close;

}

Отметим, что первые несколько строк кода идентичны коду, который использовался для сериализации объекта.

  • Читать дальше
  • 1
  • ...
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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