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

 
                