读书笔记(序列化)

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




 

  

posted @ 2014-07-31 11:25  sophiadv  阅读(191)  评论(0编辑  收藏  举报