Csharp/C Sharp/XML/Xml Serialization
Содержание
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>