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

на главную

Жанры

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

Ватсон Карли

Шрифт:

<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
:

private void button1_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;

 //добавить к коллекций атрибутов

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

 // создать объекты Product и Book

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

 //Product[] addProd={newBook};

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

 }

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

Под крылом ворона

Шебалин Дмитрий Васильевич
3. Чужие интересы
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Под крылом ворона

Инженер Петра Великого 3

Гросов Виктор
3. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Инженер Петра Великого 3

Отморозок 2

Поповский Андрей Владимирович
2. Отморозок
Фантастика:
попаданцы
5.00
рейтинг книги
Отморозок 2

На границе империй. Том 9. Часть 3

INDIGO
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 3

Законник Российской Империи. Том 2

Ткачев Андрей Юрьевич
2. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
6.40
рейтинг книги
Законник Российской Империи. Том 2

Казачий князь

Трофимов Ерофей
5. Шатун
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Казачий князь

На границе империй. Том 10. Часть 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 3

Черный Маг Императора 10

Герда Александр
10. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 10

Убивать чтобы жить 7

Бор Жорж
7. УЧЖ
Фантастика:
героическая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 7

Жандарм 5

Семин Никита
5. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Жандарм 5

Настроение – Песец

Видум Инди
7. Под знаком Песца
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Настроение – Песец

Стражи душ

Кас Маркус
4. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Стражи душ

Измена. Не прощу

Леманн Анастасия
1. Измены
Любовные романы:
современные любовные романы
4.00
рейтинг книги
Измена. Не прощу

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие