C#实现XML序列化与反序列化

  目录

  一、使用 System.Xml.Serialization类

  1、定义元数据

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

  XML序列化常用属性:

  [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

  派生类:

  需要引入的程序集:

  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内容

  

  

  

  XiaMen

  d3b4c977-d052-4fd4-8f59-272e56d875a8

  

  96d0bb44-cee4-41b6-ae20-5d801c1b3dc9

  

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

  您可能感兴趣的文章: