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;}
}
Поделиться:
Популярные книги
Кровь Василиска
1. Кровь Василиска
Фантастика:
фэнтези
попаданцы
аниме
4.25
рейтинг книги
Венецианский купец
1. Венецианский купец
Фантастика:
фэнтези
героическая фантастика
альтернативная история
7.31
рейтинг книги
Сопряжение 9
9. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
технофэнтези
рпг
5.00
рейтинг книги
На три фронта
3. Иной
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Авиатор: назад в СССР 11
11. Покоряя небо
Фантастика:
альтернативная история
5.00
рейтинг книги
Санек
1. Санек
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Лорд Системы 8
8. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Мерзавец
3. Братья Майоровы
Любовные романы:
современные любовные романы
эро литература
короткие любовные романы
5.00
рейтинг книги
Игра топа. Между двух огней
2. Игра топа
Фантастика:
фэнтези
7.57
рейтинг книги
Провинциал. Книга 2
2. Провинциал
Фантастика:
космическая фантастика
рпг
аниме
5.00
рейтинг книги
Идущий в тени 6
6. Идущий в тени
Фантастика:
фэнтези
рпг
5.57
рейтинг книги
На границе империй. Том 9. Часть 4
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Крестоносец
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Идеальный мир для Лекаря 10
10. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00