C(※)シリアル化と逆シリアル化--Xml Serializerを使ってシリアル化する(別の方法)

3277 ワード

4、Xml Serializerを使ってシリアル化(別の方法)Xml Serializerシリアル化は、「Serializable()」特性を使用するほか、Xml Root、Xml Attribute、XmlElementなどの特性を使って直接データメンバーをマークする方法があります.
[XmlRoot()]
    public class Product
    {
        private int prodId;
        private string prodName;
        private int catId;
        private int disc;

        [XmlAttribute("Discount")]
        public int Discount
        {
            get { return disc; }
            set { disc = value; }
        }

        [XmlElement()]
        public int ProductID
        {
            get { return prodId; }
            set { prodId = value; }
        }

        [XmlElement()]
        public string ProductName
        {
            get { return prodName; }
            set { prodName = value; }
        }

        [XmlElement()]
        public int CatID
        {
            get { return catId; }
            set { catId = value; }
        }
    }

    public class BookProduct : Product
    {
        private string isbnNum;
        public string ISBnNum
        {
            get { return isbnNum; }
            set { isbnNum = value; }
        }
    }

    public class Inverntory
    {
        private Product[] stuff;

        public Product[] InventoryItems
        {
            get { return stuff; }
            set { stuff = value; }
        }
    }

    public sealed class ConfigurationManagerInverntory
    {
        private static string path = System.Windows.Forms.Application.StartupPath + "\\Inverntory.xml";

        public static Inverntory Get()
        {
            if (!File.Exists(path))
                return null;
            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(Inverntory), "InventoryItems", attrs);

            XmlSerializer xs = new XmlSerializer(typeof(Inverntory), attrOver);
            using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                return (Inverntory)xs.Deserialize(fs);
            }
        }

        public static void Set(Inverntory hr)
        {
            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(Inverntory), "InventoryItems", attrs);

            XmlSerializer xs = new XmlSerializer(typeof(Inverntory), attrOver);
            using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
            {
                xs.Serialize(fs, hr);
            }
        }
    }
備考:
以上、より複雑なシリアル化の例を示しました.このようにオブジェクトをシリアル化するには、Xml AttributeOverridesを使用してXml Serializerオブジェクトを定義する必要があります.Xml AttributeOverridesオブジェクトには、セット中の要素が含まれている具体的なタイプがあります.
プログレッシブと反プログレッシブの場合は、Xml AttributeOverridesオブジェクトを定義し、システムのためにセット内の要素の具体的なタイプを指定する必要があります.