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); // // //   //        //         1 // //    //           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"> //   //    1 // //   //    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内容

   XiaMend3b4c977-d052-4fd4-8f59-272e56d875a896d0bb44-cee4-41b6-ae20-5d801c1b3dc9

到此这篇关于C#实现XML序列化与反序列化的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持0133技术站。

以上就是C#实现XML序列化与反序列化的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 其他教程