Inventory inv=new Inventory();

 inv.InventoryItems=addProd;

 TextWriter tr=new StreamWriter('..\..\..\inventory.xml');

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

 sr.Serialize(tr, inv);

 tr.Close();

}

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

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

 // создаем новую коллекцию XmlAttributes

 XmlAttributes attrs=new XmlAttributes();

 // добавляем информацию о типе к коллекции элементов

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

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

 XmlAttributeOverrides attrOver=new XmlAttributeOverrides();

 //добавляем к коллекции Attributes (атрибутов)

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

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

 Inventory newInv;

 // десериализуем и загружаем данные в окно списка из

 // десериализованного объекта

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

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

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

 if (newInv!=null) {

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

 }

 f.Close();

}

// это те же классы, что и в предыдущем примере

// за исключением удаленных атрибутов

// из свойства InventoryItems для Inventory

public class Inventory {

 private Product[] stuff;

 public Inventory() {}

 public Product[] InventoryItems {

  get {return stuff;}

  set {stuff=value;}

 }

}

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;}

 }

}

public class BookProduct:Product {

 private string isbnNum;

 public BookProduct() {}

 public string ISBN {

  get {return isbnNum;}

  set {isbnNum=value;}

 }

}

Это тот же пример, что и раньше, но первое, что необходимо заметить,— здесь нет добавленных в класс 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:

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату