Ватсон Карли
Шрифт:
}
Это тот же пример, что и раньше, но первое, что необходимо заметить,— здесь нет добавленных в класс
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;
}
Отметим, что первые несколько строк кода идентичны коду, который использовался для сериализации объекта.