首页 > 代码库 > 读书笔记

读书笔记

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只能序列化公共成员变量