zoukankan      html  css  js  c++  java
  • C#(4):XML序列化

    一、使用 System.Xml.Serialization类

    1、定义元数据

    引入System.Xml.Serialization命名空间。

    XML序列化常用属性:

    • XmlRoot
    • XmlType
    • XmlText
    • XmlEnum
    [Serializable]
    [XmlRoot]
    public class Product
    {
        public int ProductID { set; get; }//默认为[XmlElement("ProductID")] 
    
        [XmlAttribute("Discount")]
        public int DisCount { set; get; }
    }
    
    public class BookProduct : Product
    {
        public BookProduct() { }
        public string ISBN { get; set; }
    }
    
    [XmlRoot("inv")]
    public class Inventory
    {
        public Inventory() { }
        [XmlArray("allpro")]
        [XmlArrayItem("prod", typeof(Product)),
         XmlArrayItem("book", typeof(BookProduct))]
        public Product[] InventroyItems { set; get; }
    }

    2、简单序列化与反序列化

    //序列化
    Product product = new Product() { ProductID = 1, DisCount = 5 };
    string s = "";
    using (StringWriter sw = new StringWriter())
    {
        XmlSerializer xz = new XmlSerializer(typeof(Product));
        xz.Serialize(sw, product);
        s = sw.ToString();
    }
    Console.WriteLine(s);

    //<?xml version="1.0" encoding="utf-16"?>
    //<Product xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Discount="5">
    //  <ProductID>1</ProductID>
    //</Product>
    
    //反序列化
    using (StringReader sr = new StringReader(s))
    {
        XmlSerializer xz = new XmlSerializer(typeof(Product));
        product = xz.Deserialize(sr) as Product;
    }
    
    Console.WriteLine(product .ProductID.ToString() + ", " + product.DisCount); //1, 5

    3、集合的序列化与反序列化

    //序列化
    List<Product> list = new List<Product>(){
        new Product() { ProductID = 1, DisCount =5 },
        new BookProduct() {  ProductID = 1, DisCount =3, ISBN="aaaa"}
       };
    Inventory invertoy = new Inventory { InventroyItems = list.ToArray() };
    
    string s = "";
    using (StringWriter sw = new StringWriter())
    {
        XmlSerializer xz = new XmlSerializer(typeof(Inventory));
        xz.Serialize(sw, invertoy);
        s = sw.ToString();
    }
    Console.WriteLine(s);

    //<?xml version="1.0" encoding="utf-16"?>
    //<inv xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    // <allpro>
    //    <prod Discount="5">
    //     <ProductID>1</ProductID>
    //    </prod>
    //  <book Discount="3">
    //      <ProductID>1</ProductID>
    //      <ISBN>aaaa</ISBN>
    //    </book>
    //  </allpro>
    //</inv>
    
    //反序列化
    using (StringReader sr = new StringReader(s))
    {
        XmlSerializer xz = new XmlSerializer(typeof(Inventory));
        invertoy = xz.Deserialize(sr) as Inventory;
    }
    
    Console.WriteLine(invertoy.InventroyItems[0].ProductID.ToString() + ", " + invertoy.InventroyItems[0].DisCount); //1, 5
    

    4、在不能更改数据的情况下,可以用代码重载 XmlAttributeOverrides

    List<Product> list = new List<Product>(){
        new Product() { ProductID = 1, DisCount =5 },
        new BookProduct() {  ProductID = 1, DisCount =3, ISBN="aaaa"}
      };
    Inventory invertoy = new Inventory { InventroyItems = list.ToArray() };
    
    
    string s = "";
    //序列化
    using (StringWriter sw = new StringWriter())
    {
        XmlAttributes attrs = new XmlAttributes();
        attrs.XmlElements.Add(new XmlElementAttribute("product1", typeof(Product)));
        attrs.XmlElements.Add(new XmlElementAttribute("book1", typeof(BookProduct)));
        XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides();
        attrOverrides.Add(typeof(Inventory), "InventroyItems", attrs);
        XmlSerializer xz = new XmlSerializer(typeof(Inventory), attrOverrides);
    
        xz.Serialize(sw, invertoy);
        s = sw.ToString();
    }
    Console.WriteLine(s);
    
    //<?xml version="1.0" encoding="utf-16"?>
    //<inv xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    //  <product1 Discount="5">
    //    <ProductID>1</ProductID>
    //  </product1>
    //  <book1 Discount="3">
    //    <ProductID>1</ProductID>
    //    <ISBN>aaaa</ISBN>
    //  </book1>
    
    //</inv>
    
    
    //反序列化
    using (StringReader sr = new StringReader(s))
    {
        XmlAttributes attrs = new XmlAttributes();
        attrs.XmlElements.Add(new XmlElementAttribute("product1", typeof(Product)));
        attrs.XmlElements.Add(new XmlElementAttribute("book1", typeof(BookProduct)));
        XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides();
        attrOverrides.Add(typeof(Inventory), "InventroyItems", attrs);
        XmlSerializer xz = new XmlSerializer(typeof(Inventory), attrOverrides);
        invertoy = xz.Deserialize(sr) as Inventory;
    }
    
    Console.WriteLine(invertoy.InventroyItems[0].ProductID.ToString() + ", " + invertoy.InventroyItems[0].DisCount); //1, 5

    5、通用类

    void Main()
    {
        //序列化
        Product product = new Product() { ProductID = 1, DisCount = 5 };
        string s = UserQuery.SimpleSerializer.Serialize(product);
        Console.WriteLine(s);
    
        //反序列化
        product = UserQuery.SimpleSerializer.Deserialize<Product>(typeof(UserQuery.Product), s);
        Console.WriteLine(product.ProductID.ToString() + ", " + product.DisCount); //1, 5
    }
    public class SimpleSerializer
    {
        /// <summary>
        /// 序列化对象
        /// </summary>
        /// <typeparam name="T">对象类型</typeparam>
        /// <param name="t">对象</param>
        /// <returns></returns>
        public static string Serialize<T>(T t)
        {
            using (StringWriter sw = new StringWriter())
            {
                XmlSerializer xz = new XmlSerializer(t.GetType());
                xz.Serialize(sw, t);
                return sw.ToString();
            }
        }
    
        /// <summary>
        /// 反序列化为对象
        /// </summary>
        /// <param name="type">对象类型</param>
        /// <param name="s">对象序列化后的Xml字符串</param>
        /// <returns></returns>
        public static T Deserialize<T>(Type type, string s) where T : class
        {
            using (StringReader sr = new StringReader(s))
            {
                XmlSerializer xz = new XmlSerializer(type);
                return xz.Deserialize(sr) as T;
            }
        }
    }

    二、用DataContractSerialize类序列化XML

    1、层次结构

    基类:XmlObjectSerializer

    派生类:

    • DataContractSerializer
    • NetDataContractSerializer
    • DataContractJsonSerializer

    需要引入的程序集:

    • System.Runtime.Serialization.dll
    • System.Runtime.Serialization.Primitives.dll

    2、实体类

    //订单类
    [DataContract(Name = "order", Namespace = "http://a/order")]
    //[KnownType(typeof(order))]
    public class Order
    {
        public Order(Guid id, Product product)
        {
            this.OrderID = id;
            this.Product = product;
        }
    
        [DataMember(Name = "id", Order = 2)]
        public Guid OrderID { set; get; }
    
        [DataMember]
        public Product Product { set; get; }
    
    }
    
    //产品类
    [DataContract(Name = "product", Namespace = "http://a/product")] //IsRequired=false,EmitDefaultValue=false
    public class Product
    {
        public Product(Guid id, string productArea)
        {
            this.ProductID = id;
            this.productArea = productArea;
        }
    
        [DataMember(Name = "id", Order = 1)]
        public Guid ProductID { set; get; }
    
        [DataMember]
        private string productArea { set; get; } //私有属性也可以序列化。
    }

    3、序列化与反序列化

    Product product = new Product(Guid.NewGuid(), "XiaMen");
    Order order = new Order(Guid.NewGuid(), product);
    
    string filename = @"C:s.xml";
    using (FileStream fs = new FileStream(filename, FileMode.Create))
    {
        DataContractSerializer serializer = new DataContractSerializer(typeof(Order));
        using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(fs))
        {
            serializer.WriteObject(writer, order);
        }
    }
    Process.Start(filename);
    
    using (FileStream fs = new FileStream(filename, FileMode.Open))
    {
        DataContractSerializer serializer = new DataContractSerializer(typeof(Order));
        using (XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas()))
        {
            order = serializer.ReadObject(reader) as Order;
        }
    }

    得到的XML内容

    <?xml version="1.0" encoding="utf-8"?>
    <order xmlns="http://a/order" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      <Product xmlns:a="http://a/product">
        <a:productArea>XiaMen</a:productArea>
        <a:id>d3b4c977-d052-4fd4-8f59-272e56d875a8</a:id>
      </Product>
      <id>96d0bb44-cee4-41b6-ae20-5d801c1b3dc9</id>
    </order>
  • 相关阅读:
    Vmware安装CentOs7.4
    记录一次简单的springboot发送邮件功能
    jenkins 脱机下 安装插件失败
    centos8系统下docker安装jenkins
    Flask快速入门(9) — 请求扩展
    Flask快速入门(8) — 闪现flash
    Flask快速入门(7) — session
    Flask快速入门(6) — 常见的请求与响应参数
    Flask快速入门(5) — 模板渲染
    Flask快速入门(4) — CBV写法与解析
  • 原文地址:https://www.cnblogs.com/springsnow/p/12884534.html
Copyright © 2011-2022 走看看