C#实现XML序列化与反序列化
目录
- 一、使用 System.Xml.Serialization类
- 1、定义元数据
- 2、简单序列化与反序列化
- 3、集合的序列化与反序列化
- 4、在不能更改数据的情况下,可以用代码重载 XmlAttributeOverrides
- 5、通用类
- 二、用DataContractSerialize类序列化XML
- 1、层次结构
- 2、实体类
- 3、序列化与反序列化
一、使用 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=https://www.it610.com/article/falsepublic 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-272e56d875a8 96d0bb44-cee4-41b6-ae20-5d801c1b3dc9
【C#实现XML序列化与反序列化】到此这篇关于C#实现XML序列化与反序列化的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- Qt中PaintEvent绘制实时波形图的实现示例
- C#使用XSLT实现xsl、xml与html相互转换
- C#/VB.NET|C#/VB.NET 实现在PDF表格中添加条形码
- C#使?XmlReader和XmlWriter操作XML?件
- C#下使用XmlDocument操作XML详解
- 想说爱你不容易 | 使用最小 WEB API 实现文件上传(Swagger 支持)#yyds干货盘点#
- 【Java并发编程】Synchronized关键字实现原理
- #yyds干货盘点#使用线程安全型双向链表实现简单 LRU Cache 模拟
- ConcurrentHashMap底层实现#yyds干货盘点#
- #yyds干货盘点#想说爱你不容易 | 使用最小 WEB API 实现文件上传