C#XML 序列化两个继承类

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.IO;

namespace SerializedDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            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), "InverntoryItems", attrs);
            //
            Product newProd = new Product();
            BookProduct newBook = new BookProduct();
            newProd.ProductID = 100;
            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";
            Inventory newInv = new Inventory();
            newInv.InventoryItems = new Product[] { newBook, newProd };
            TextWriter tr = new StreamWriter("inventory.xml");
            XmlSerializer sr = new XmlSerializer(typeof(Inventory), attrOver);
            
            sr.Serialize(tr,newInv);
            tr.Close();

            #region 反序列号
            Inventory new2Inv;
            FileStream f = new FileStream("inventory.xml",FileMode.Open);
            XmlSerializer newSr = new XmlSerializer(typeof(Inventory));
            new2Inv = (Inventory)newSr.Deserialize(f);
            #endregion
        }
    }
    [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 override string ToString()
        {
            StringBuilder outText = new StringBuilder();
            outText.Append(prodId);
            outText.Append("\r\n");
            outText.Append(prodName);
            outText.Append("\r\n ");
            outText.Append(unitPrice);
            return outText.ToString();
        }
    }

    public class Inventory
    {

        private Product[] stuff;
        //ctor
        public Inventory() { }
        //need have an attribute entry for each data type
        [XmlArrayItem("Prod", typeof(Product)),
        XmlArrayItem("Book", typeof(BookProduct))]
        public Product[] InventoryItems
        {
            get { return stuff; }
            set { stuff = value; }
        }

        public override string ToString()
        {
            StringBuilder outText = new StringBuilder();
            foreach (Product prod in stuff)
            {
                outText.Append(prod.ProductName);
                outText.Append("\r\n");
            }
            return outText.ToString();
        }
    }

    public class BookProduct : Product
    {
        private string isbnNum;

        public BookProduct() { }

        public string ISBN
        {
            get { return isbnNum; }
            set { isbnNum = value; }
        }

    }
}

ReadXmlSchema();只得到里面的架构

posted on 2013-01-20 22:12  R.Ray  阅读(653)  评论(0)    收藏  举报

导航