Csharp/C Sharp/XML/Xml Serialization

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Serialize List of Objects

<source lang="csharp">

using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Soap; using System.Xml.Serialization; using System.Collections; [Serializable] public class Radio {

   public bool hasTweeters;
   public bool hasSubWoofers;
   public double[] stationPresets;
   [NonSerialized]
   public string radioID = "002";

} [Serializable] public class Car {

   public Radio theRadio = new Radio();
   public bool isHatchBack;

} [Serializable, XmlRoot(Namespace = "http://www.yoursite.ru")] public class MyCar : Car {

   public MyCar(bool SkyWorthy, bool SeaWorthy) {
       canFly = SkyWorthy;
       canSubmerge = SeaWorthy;
   }
   public MyCar() { }
   [XmlAttribute]
   public bool canFly;
   [XmlAttribute]
   public bool canSubmerge;

} class Program {

   static void Main(string[] args) {
       MyCar jbc = new MyCar();
       jbc.canFly = true;
       jbc.canSubmerge = false;
       jbc.theRadio.stationPresets = new double[] { 89.3, 105.1, 97.1 };
       jbc.theRadio.hasTweeters = true;
       BinaryFormatter binFormat = new BinaryFormatter();
       Stream fStream = new FileStream("CarData.dat",FileMode.Create, FileAccess.Write, FileShare.None);
       binFormat.Serialize(fStream, jbc);
       fStream.Close();
       fStream = File.OpenRead("CarData.dat");
       MyCar carFromDisk =(MyCar)binFormat.Deserialize(fStream);
       fStream.Close();
       SoapFormatter soapForamt = new SoapFormatter();
       fStream = new FileStream("CarData.soap",FileMode.Create, FileAccess.Write, FileShare.None);
       soapForamt.Serialize(fStream, jbc);
       fStream.Close();
       XmlSerializer xmlForamt = new XmlSerializer(typeof(MyCar),new Type[] { typeof(Radio), typeof(Car) });
       fStream = new FileStream("CarData.xml",FileMode.Create, FileAccess.Write, FileShare.None);
       xmlForamt.Serialize(fStream, jbc);
       fStream.Close();
       ArrayList myCars = new ArrayList();
       myCars.Add(new MyCar(true, true));
       myCars.Add(new MyCar(true, false));
       myCars.Add(new MyCar(false, true));
       myCars.Add(new MyCar(false, false));
       fStream = new FileStream("CarCollection.xml",FileMode.Create, FileAccess.Write, FileShare.None);
       xmlForamt = new XmlSerializer(typeof(ArrayList),new Type[] { typeof(MyCar), typeof(Car), typeof(Radio) });
       xmlForamt.Serialize(fStream, myCars);
       fStream.Close();
   }

}

      </source>


Set Xml Attribute when serilzation

<source lang="csharp">

using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Xml; using System.Xml.Serialization; public class MainClass {

   public static void Main() {
       Product pd = new Product();
       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;
       TextWriter tr = new StreamWriter("serialprod.xml");
       XmlSerializer sr = new XmlSerializer(typeof(Product));
       sr.Serialize(tr, pd);
       tr.Close();
   }

} [System.Xml.Serialization.XmlRootAttribute()] public class Product {

   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;
   //added the Discount attribute
   [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; }
       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 unitsOnOrder; }
       set { unitsOnOrder = value; }
   }
   [XmlElementAttribute()]
   public short ReorderLevel {
       get { return reorderLvl; }
       set { reorderLvl = value; }
   }
   [XmlElementAttribute()]
   public bool Discontinued {
       get { return discont; }
       set { discont = value; }
   }

}

public class Inventory {

   private Product[] stuff;
   public Inventory() { }
   [XmlArrayItem("Prod", typeof(Product)),
   XmlArrayItem("Book", typeof(BookProduct))]
   public Product[] InventoryItems {
       get { return stuff; }
       set { stuff = value; }
   }

} public class BookProduct : Product {

   private string isbnNum;
   public BookProduct() { }
   public string ISBN {
       get { return isbnNum; }
       set { isbnNum = value; }
   }

}

      </source>


Use XML Serialization with Custom Objects

<source lang="csharp"> using System; using System.IO; using System.Xml; using System.Xml.Serialization; [XmlRoot("productCatalog")] class ProductCatalog {

   [XmlElement("catalogName")]
   public string CatalogName;
   [XmlElement(ElementName = "expiryDate", DataType = "date")]
   public DateTime ExpiryDate;
   [XmlArray("products")]
   [XmlArrayItem("product")]
   public Product[] Products;
   public ProductCatalog() { }
   public ProductCatalog(string catalogName, DateTime expiryDate) {
       this.CatalogName = catalogName;
       this.ExpiryDate = expiryDate;
   }

} public class Product {

   [XmlElement("productName")]
   public string ProductName;
   [XmlElement("productPrice")]
   public decimal ProductPrice;
   [XmlElement("inStock")]
   public bool InStock;
   [XmlAttributeAttribute(AttributeName = "id", DataType = "integer")]
   public string Id;
   public Product() {}
   public Product(string productName, decimal productPrice) {
       this.ProductName = productName;
       this.ProductPrice = productPrice;
   }

}

public class MainClass {

   private static void Main() {
       ProductCatalog catalog = new ProductCatalog("New Catalog", DateTime.Now.AddYears(1));
       Product[] products = new Product[2];
       products[0] = new Product("Product 1", 42.99m);
       products[1] = new Product("Product 2", 202.99m);
       catalog.Products = products;
       XmlSerializer serializer = new XmlSerializer(typeof(ProductCatalog));
       FileStream fs = new FileStream("ProductCatalog.xml", FileMode.Create);
       serializer.Serialize(fs, catalog);
       fs.Close();
       catalog = null;
       fs = new FileStream("ProductCatalog.xml", FileMode.Open);
       catalog = (ProductCatalog)serializer.Deserialize(fs);
       serializer.Serialize(Console.Out, catalog);
   }

}


      </source>


Use XmlSerializer

<source lang="csharp">

using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Xml; using System.Xml.Serialization; public class MainClass { //new products object

   public static void Main() {
       Product newPd;
       FileStream f = new FileStream("serialprod.xml", FileMode.Open);
       XmlSerializer newSr = new XmlSerializer(typeof(Product));
       newPd = (Product)newSr.Deserialize(f);
       f.Close();
   }

} [System.Xml.Serialization.XmlRootAttribute()] public class Product {

   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;
   [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; }
       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 unitsOnOrder; }
       set { unitsOnOrder = value; }
   }
   [XmlElementAttribute()]
   public short ReorderLevel {
       get { return reorderLvl; }
       set { reorderLvl = value; }
   }
   [XmlElementAttribute()]
   public bool Discontinued {
       get { return discont; }
       set { discont = value; }
   }

}

public class Inventory {

   private Product[] stuff;
   public Inventory() { }
   [XmlArrayItem("Prod", typeof(Product)),
   XmlArrayItem("Book", typeof(BookProduct))]
   public Product[] InventoryItems {
       get { return stuff; }
       set { stuff = value; }
   }

} public class BookProduct : Product {

   private string isbnNum;
   public BookProduct() { }
   public string ISBN {
       get { return isbnNum; }
       set { isbnNum = value; }
   }

}

      </source>


XmlRootAttribute

<source lang="csharp"> using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Xml; using System.Xml.Serialization; public class MainClass { //new products object

   public static void Main() {
       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 newProd = new Product();
       BookProduct newBook = new BookProduct();
       newProd.ProductID = 100;
       newProd.ProductName = "Product";
       newProd.SupplierID = 10;
       newBook.ProductID = 101;
       newBook.ProductName = "New Product";
       newBook.SupplierID = 10;
       newBook.ISBN = "123456789";
       Product[] addProd = { newProd, 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();
   }

} [System.Xml.Serialization.XmlRootAttribute()] public class Product {

   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;
   [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; }
       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 unitsOnOrder; }
       set { unitsOnOrder = value; }
   }
   [XmlElementAttribute()]
   public short ReorderLevel {
       get { return reorderLvl; }
       set { reorderLvl = value; }
   }
   [XmlElementAttribute()]
   public bool Discontinued {
       get { return discont; }
       set { discont = value; }
   }

} public class Inventory {

   private Product[] stuff;
   public Inventory() { }
   [XmlArrayItem("Prod", typeof(Product)),
   XmlArrayItem("Book", typeof(BookProduct))]
   public Product[] InventoryItems {
       get { return stuff; }
       set { stuff = value; }
   }

} public class BookProduct : Product {

   private string isbnNum;
   public BookProduct() { }
   public string ISBN {
       get { return isbnNum; }
       set { isbnNum = value; }
   }

}

      </source>