xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<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>
Здесь нет ничего необычного. Мы могли бы выполнить преобразование документа XML и вывести его как HTML, загрузить его в DataSet
с помощью ADO.NET, загрузить с его помощью XmlDocument
, как в примере, десериализовать его и создать объект в том же состоянии, которое имел pd
перед своей сериализацией (что соответствует событию второй кнопки).
Рассмотренный только что пример является очень простым. Обычно имеется ряд методов получения (get) и задания (set) свойств для работы с данными в объекте. Но что, если объект состоит из двух других объектов, или выводится из базового класса, из которого следуют и другие классы?
Такие ситуации обрабатываются с помощью класса XmlSerializer
. Давайте усложним пример (находится в SerialSample2
). Для большей реалистичности сделаем каждое свойство доступным через методы get и set:
private void button1_Click(object sender, System.EventArgs e) {
// новый объект products
Products pd=new Products();
// задать некоторые свойства
pd.ProductID=200;
pd.CategoryID=100;
pd.Discontinued=false;
pd.ProductName='Serialize Objects';
pd.QuantityPerUnit='6';
pd.ReorderLevel=1;
pd.SupplierID=1;
pd.UnitPrice=1000;
pd.UnitsInStock=10;
pd.UnitsOnOrder= 0;
pd.Discount=2;
//новые TextWriter и XmlSerializer
TextWriter tr=new StreamWriter('..\..\..\serialprod1.xml');
XmlSerializer sr=new XmlSerializer(typeof(Products));
// сериализируем объект
sr.Serialize(tr, pd);
tr.Close();
}
private void button2_Click(object sender, System.EventArgs e) {
//создать ссылку на тип Products
Products newPd;
// новый файловый поток для открытия сериализуемого объекта
FileStream f=new FileStream('..\..\..\serialprod1.xml', FileMode.Open);
// новый сериализатор
XmlSerializer newSr=new XmlSerializer(typeof(Products));
//десериализуем объект
newPd=(Products)newSr.Deserialize(f);
//загрузить его в окно списка.
listBox1.Items.Add(newPd.ProductName);
f.Close();
}
//класс, который будет сериализован.
//атрибуты определяют, как объект сериализуется
[System.Xml.Serialization.XmlRootAttribute()]
public class Products {
private int prodId;
private string prodName;
private int suppId;
private int catId;
private string qtyPerUnit;
private Decimal unitPrice;
private short unitsInStock;
private short unitsOnOrder;
private short reorderLvl;
private bool discont;
private int disc;
// добавлен атрибут Discount
[XmlAttributeAttribute(AttributeName='Discount')]
public int Discount {
get {return disc;}
set {disc=value;}
}
[XmlElementAttribute()]
public int ProductID {
get {return prodId;}
set {prodId=value;}
}
[XmlElementAttribute()]
public string ProductName {
get {return prodName;}
set {prodName=value;}
}
[XmlElementAttribute()]
public int SupplierID {
get {return suppId;}
set {suppId=value;}
}
[XmlElementAttribute()]
public int CategoryID {
get {return catId;}