C#实现XML序列化与反序列化
这篇文章介绍了C#实现XML序列化与反序列化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
一、使用 System.Xml.Serialization类
1、定义元数据
引入System.Xml.Serialization命名空间。
XML序列化常用属性:
- XmlRoot
- XmlType
- XmlText
- XmlEnum
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
[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、简单序列化与反序列化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//序列化 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); //反序列化
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、集合的序列化与反序列化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
//序列化 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); //反序列化 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
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); //反序列化 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、通用类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
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、实体类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
//订单类 [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、序列化与反序列化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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内容
1
2
3
4
5
6
7
8
|
< 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 > |