.Net框架中提供了3中序列化的方式, 分别是:
- Binary Serializer
- Soap Serializer
- XML Serializer
1. Binary Serializer
如果需要序列化这个类的对象,那么这个类必须要标记为是可序列化的。需要用到特性 [Serializable] (作用域是Class, Struct, Enum, Delegate)
如果某些变量不需要序列化, 或者不能序列化可以使用[NonSerialized], (作用域是Field)
需要注意, 如果类中使用了其它的类属性,如果希望它们能序列化,那么其它的类也必须是可序列化的, 如下面类DethDisease
2 {
3 [Serializable]
4 public class Person
5 {
6 [NonSerialized]
7 private int _age;
8 public int Age
9 {
10 get
11 {
12 return _age;
13 }
14 set
15 {
16 _age = value;
17 }
18 }
19 public DethDisease Disease
20 {
21 get;
22 set;
23 }
24 public string Medicine
25 {
26 get;
27 set;
28 }
29 public Person()
30 {
31 Age = 0;
32 }
33 public bool Live()
34 {
35 Age++;
36 if (Disease != null && !Disease.CanLive(Age, Medicine))
37 return false;
38 return true;
39 }
40 }
41 }
二进制序列化的代码, 主要是这个BinaryFormatter.
2 Stream stream = new FileStream("Person", FileMode.Create, FileAccess.Write, FileShare.None);
3 formatter.Serialize(stream, newPerson);
4 stream.Close();
反序列化
2 Stream stream = new FileStream("Person", FileMode.Open, FileAccess.Read, FileShare.Read);
3 newPerson = (Person)formatter.Deserialize(stream);
4 stream.Close();
2. Soap Serializer
基本和上面的一样,只是用到不同的IFormatter实现,SoapFormatter
3. XML Serializer
使用xml Serializer, 不需要使用特性[Serializable]
使用xml Serializer, 有相关的一些其它特性来改变xml的输出结果。
XmlRoot: 作用于类根元素, 控制根元素的输出
XmlElement: 作用于类的属性或field
XmlAttribute: 作为属性输出,而不是节点
XmlIgnore: 不输出
XmlText: 必须是字符串类型, 一个类中只能有一个这个特性, 没有标签包裹,也不作为属性
XmlArray: 作用于数组类型, 可以控制数组的输出
这里是常用的序列化xml的核心方法
2 {
3 string xmlString = string.Empty;
4 XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
5 using (MemoryStream ms = new MemoryStream())
6 {
7 xmlSerializer.Serialize(ms, obj);
8 xmlString = Encoding.UTF8.GetString(ms.ToArray());
9 }
10 return xmlString;
11 }
12 public static T XmlDeserialize<T>(string xmlString)
13 {
14 T t = default(T);
15 XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
16 using (Stream xmlStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlString)))
17 {
18 using (XmlReader xmlReader = XmlReader.Create(xmlStream))
19 {
20 Object obj = xmlSerializer.Deserialize(xmlReader);
21 t = (T)obj;
22 }
23 }
24 return t;
25 }
三种方式比较:
Binary方式效率最高,可读性不如后两种好。
Soap方式可以用于跨平台传输, xml方式简单易用,用于程序内部使用,灵活方便。
相关源代码: SerializationDemo