代码改变世界

.net中的对象序列化(2):三种序列化方式

2012-03-25 16:38  JustRun  阅读(...)  评论(...编辑  收藏

.Net框架中提供了3中序列化的方式, 分别是:

  • Binary Serializer
  • Soap Serializer
  • XML Serializer

1. Binary Serializer

如果需要序列化这个类的对象,那么这个类必须要标记为是可序列化的。需要用到特性 [Serializable] (作用域是Class, Struct, Enum, Delegate)

如果某些变量不需要序列化, 或者不能序列化可以使用[NonSerialized], (作用域是Field)

需要注意, 如果类中使用了其它的类属性,如果希望它们能序列化,那么其它的类也必须是可序列化的, 如下面类DethDisease

 

 1 namespace SerializationDemo 
 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.

 

1 IFormatter formatter = new BinaryFormatter(); 
2 Stream stream = new FileStream("Person", FileMode.Create, FileAccess.Write, FileShare.None); 
3 formatter.Serialize(stream, newPerson); 
4 stream.Close();

 

 

反序列化

 

1 IFormatter formatter = new BinaryFormatter(); 
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的核心方法

 

 1 public static string XmlSerialize<T>(T obj) 
 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