读书笔记(序列化)
serializable特性有何作用
通过流类型可以方便地操作各种字节流,但如何把现有的对象转换成为方便输出的字节流,就需要用到序列化技术。
对象实例的序列化,是指把实例对象转换成可方便存储,传输,和交互的流。而对象的实例则包含类型的成员变量,类型的名称以及所在程序集等信息。在.NET中,通过serializable特性提供了序列化对象实例的机制,当一个类型被申明为serializable后,它就能被诸如BinaryFormatter等实现了IFormatter接口的类型对象进行序列化和反序列化
当一个基类使用了serializable特性之后,并不意味着其所有子类都能被序列化,事实上,程序员必须为每个子类都添加serializable特性来保证其能被正确地序列化。
1 static Byte[] Serialize(Person obj) 2 { 3 IFormatter formatter = new BinaryFormatter(); 4 using(MemoryStream ms = new MemoryStream()) 5 { 6 formatter.Serialize(ms,obj); 7 return ms.ToArray(); 8 } 9 } 10 11 static Person DeSerialize(Byte[] data) 12 { 13 IFormatter formatter = new BinaryFormatter(); 14 using(MemoryStream ms = new MemoryStream(data)) 15 { 16 return (Person)formatter.Deserialize(ms); 17 } 18 }
1 [Serializable] 2 public class Person 3 { 4 private string name; 5 [NonSerialized] 6 public int code; 7 8 public Person(int code,string name) 9 { 10 this.name = name; 11 this.code = code; 12 } 13 public override string ToString() 14 { 15 return "code : "+code+"\r\nname: "+name; 16 } 17 }
为了序列化具体实例到某种专用格式,.NET提供了三种对象序列格式化类型:BInaryFormatter,SoapFormatter,XmlSerializer
BinaryFormatter用于将可序列化的对象序列化成二进制的字节流。
SoapFormatter则用于把可序列化的类型序列化成符合SOAP规范的XML文档(SOAP是一种位于应用层的网络协议,它基于XML)
XmlSerializer并不仅针对那些使用serializable特性的类型,事实上,serializable和NonSerialized特性在XmlSerializer类型对象的操作中完全失效,取而代之的是XmlIgnore属性,XmlSerializer可以没有Serializable特性修饰类型对象进行序列化,但它仍然有一定的限制:
使用XmlSerializer序列化的对象类型必须显示地拥有一个无参构造方法
Xmlserializer只能序列化公共成员变量