set {catId=value;}
}
[XmlElementAttribute()]
public string QuantityPerUnit {
get {return qtyPerUnit;}
set {qtyPerUnit=value;}
}
[XmlElementAttribute()]
public Decimal UnitPrice {
get {return UnitPrice;}
set {unitPrice=value;}
}
[XmlElementAttribute()]
public short UnitsInStock {
get {return unitsInStock;}
set {unitsInStock=value;}
}
[XmlElementAttribute()]
public short UnitsOnOrder {
get {return unitsOrOrder;}
set {unitsOnOrder=value;}
}
[XmlElementAttribute()]
public short ReorderLevel {
get {return reorderLvl;}
set {reorderLvl=value;}
}
[XmlElementAttribute()]
public pool Discontinued {
get {return discont;}
set {discont=value;}
}
}
Выполнение этого кода вместо класса Products
в предыдущем примере даст те же самые результаты с одним исключением. Мы добавили атрибут Discount
, тем самым показав, что атрибуты также могут быть сериализуемыми. Вывод выглядит следующим образом (serialprod1.xml
):
<?xml version='1.0' encoding='utf-8'?>
<Products xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' Discount='2'>
<ProductID>200</ProductID>
<ProductName>Serialize Objects</ProductName>
<SupplierID>1</SupplierID>
<CategoryID>100</CategoryID>
<QuantityPerUnit>6</QuantityPerUnit>
<UnitPrice>1000</UnitPrice>
<UnitsInStock>10</UnitsInStock>
<UnitsOnOrder>0</UnitsOnOrder>
<ReorderLevel>1</ReorderLevel>
<Discontinued>false</Discontinued>
</Products>
Отметим атрибут Discount
элемента Products
. Поэтому теперь, когда определены средства задания и получения свойств, можно добавить более сложную проверку кода в свойствах.
Что можно сказать о ситуации, когда имеются производные классы и, возможно, свойства, которые возвращают массив? XmlSerializer
также это охватывает. Давайте обсудим более сложную ситуацию.
В событии button1_Click
создается новый объект на основе Product
и новый объект на основе BookProduct
(newProd
и newBook
). Мы добавляем данные в различные свойства каждого объекта и помещаем объекты в массив на основе Product
. Затем создается новый объект на основе Inventory
, которому в качестве параметра передается массив. Затем можно сериализовать объект Inventory
, чтобы впоследствии его восстановить:
private void button1_Click(object sender, System.EventArgs e) {
// создать новые объекты книги и книжной продукции
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};
// новый объект Inventory с помощью массива addProd
Inventory inv=new Inventory();
inv.InventoryItems=addProd;
// сериализуем объект Inventory
TextWriter tr=new StreamWriter('..\..\..\order.xml');
XmlSerializer sr=new XmlSerializer(typeof(Inventory));
sr.Serialize(tr, inv);
tr.Close();
}
Отметим в событии button2_Click
, что мы просматриваем массив во вновь созданном объекте newInv
, чтобы показать, что это те же данные:
private void button2_Click(object sender, System.EventArgs e) {
Inventory newInv;
FileStream f=new FileStream('..\..\..\order.xml', FileMode.Open);
XmlSerializer newSr=new XmlSerializer(typeof{Inventory));
newInv=(Inventory)newSr.Deserialize(f);
foreach(Product prod in newInv.Inventory Items) listBox1.Items.Add (prod.ProductName);
f.Close();
}
public class inventory {