博客园  :: 首页  :: 新随笔  :: 管理

序列化[Serializable]

Posted on 2008-07-29 14:04  tianfu  阅读(142)  评论(0编辑  收藏  举报
序列化问题,至少要明白以下几点:

 

1为什么要用序列化?

2序列化有那些属性?

3序列化的过程是什么样的?

4序列化有那些格式?

5怎样保证序列化的安全问题?

 

1为什么要用序列化?

有的时候需要使对象 能够持续化,比如在两个不同的应用程序中,使用相同的对象,这样我们就可以把对象序列化到文件系统中,通过解序列化的方式来恢复原来对象的副本或原形;还 一个用处就是用在.net Remoting中/远程模型,大家可能知道,他有两种模型:一,通过复制的方式来得到远程对象。二,按引用的方式来得到远程对象。其中使用方式一时就要 用到序列化这种技术。

 

2序列化有那些属性?

有Serializable,Noserialized,有时可以根据需要实现ISerializable接口

比如:序列化一个类:

[Serializable]

public class jianghua

{

[Noserialized] int myTest;//不需要被序列化

//.....

}

 

3序列化的过程是什么样的?

先序列化成一个对象ID,通过对象管理器自动管理,在这个过程中是使用ObjectIDGenerator ,ObjectManager 来操作的。

 

4序列化有那些格式?

.NET下提供了三种格式序列化:

BinaryFormatter

SoapFormatter

XmlSerializer

 

5怎样保证序列化的安全问题?

如果有的对象中包含一些敏感的数据,在序列化时就要小心了,我们可以借助

System.Secuiry这个空间中的方法来对对象的数据进行加密

 

最后列举一个例子:

假设有一个类MyClass

 

[Serializable]

public class MyClass

{

public string name="";

private int age=22;

public String address=null;

}

 

例:使用SoapFormatter来序列化

 

  MyClass mysoap=new MyClass();

   mysoap.name="jianghua";

   mysoap.address="Xi Hua Universtiy...";

  IFormatter myformater=new SoapFormatter();

  Stream stream=new FileStream("c:http://www.cnblogs.com/tianfu_net/admin/file://soap.xml",filemode.create,fileaccess.write,fileshare.none/);

  myformater.Serializable(stream,mysoap);

  stream.close();

 

说明:对于反序列化操作其思路基本一样,在这里附带说明以下,什么叫深序列化,什么叫浅序列化

所谓深序列化就是序列化对象中所有的公有,私有成员;浅序列化就是只序列化对象的公有成员了比如:SoapFormatter ,BinaryFormatter 就是深序列化,XmlSerializer是浅序列化;在实际开发时要注意其名称空间的使用,一般都包括以下一些名称空间:

System.Runtime.Serialization.Formatters.Binary;

System.Runtime.Serialization.Formatters.Soap;

System.Runtime.Serialization; 

System.IO;

System.Xml.Serialization;

引自 <http://blog.csdn.net/jigee/archive/2005/09/19/484445.aspx>