怎么使用C#实现XML序列化
短信预约 -IT技能 免费直播动态提醒
本篇内容主要讲解“怎么使用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=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内容
<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序列化”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341