温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么使用C#实现XML序列化

发布时间:2022-06-06 13:49:02 来源:亿速云 阅读:144 作者:iii 栏目:开发技术

本篇内容主要讲解“怎么使用C#实现XML序列化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用C#实现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); // // Discount="5"> //   1 // //反序列化 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 list = new List(){     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); // // //  <allpro> //       <prod Discount="5"> //         1 //        //   <book Discount="3"> //           1 //           aaaa //        //   allpro> // //反序列化 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 list = new List(){     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); // //http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> //  <product1 Discount="5"> //    1 //   //  <book1 Discount="3"> //    1 //    aaaa //   // //反序列化 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(typeof(UserQuery.Product), s);     Console.WriteLine(product.ProductID.ToString() + ", " + product.DisCount); //1, 5 } public class SimpleSerializer {     ///      /// 序列化对象     ///      /// 对象类型     /// 对象     ///      public static string Serialize(T t)     {         using (StringWriter sw = new StringWriter())         {             XmlSerializer xz = new XmlSerializer(t.GetType());             xz.Serialize(sw, t);             return sw.ToString();         }     }     ///      /// 反序列化为对象     ///      /// 对象类型     /// 对象序列化后的Xml字符串     ///      public static T Deserialize(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>

到此,相信大家对“怎么使用C#实现XML序列化”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

xml
AI