序列化问题--之我见

来源:互联网 发布:斯巴达300勇士 知乎 编辑:程序博客网 时间:2024/04/28 20:14

      昨晚研究了一哈序列化问题,以前还以为是什么高深的技术,故此经常是避而不用,避而不谈,现在看来是我错了哦!^_^ 其实在.NET中使用序列化是很简单的事情了,希望我写这点东西,对想研究这个的同胞们一个小小的提示吧!我觉得要掌握序列化问题,至少要明白以下几点:
1为什么要用序列化?
2序列化有那些属性?
3序列化的过程是什么样的?
4序列化有那些格式?
5怎样保证序列化的安全问题?

为什么要用序列化?
有的时候需要使对象能够持续化,比如在两个不同的应用程序中,使用相同的对象,这样我们就可以把对象序列化到文件系统中,通过解序列化的方式来恢复原来对象的副本或原形;还一个用处就是用在.net Remoting中/远程模型,大家可能知道,他有两种模型:一,通过复制的方式来得到远程对象。二,按引用的方式来得到远程对象。其中使用方式一时就要用到序列化这种技术。
序列化有那些属性?
有Serializable,Noserialized,有时可以根据需要实现ISerializable接口
比如:序列化一个类:
[Serializable]
public class jianghua
{
[Noserialized] int myTest;//不需要被序列化
//.....
}
序列化的过程是什么样的?
先序列化成一个对象ID,通过对象管理器自动管理,在这个过程中是使用ObjectIDGenerator ,ObjectManager 来操作的。
序列化有那些格式?
在,NET下提供了三种格式序列化:
BinaryFormatter ,SoapFormatter ,XmlSerializer
怎样保证序列化的安全问题?
如果有的对象中包含一些敏感的数据,在序列化时就要小心了,我们可以借助
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://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;
有高见的朋友,请斧正,先谢了!^_^
我们的目的:共同进步!共同学习!
ps:昨晚此乃中秋佳节,到处洋溢着喜庆的节日气氛,窗外礼炮满天飞,可惜那却不属于我的圈子,郁闷啊!!偶,一个孤苦伶仃的实习生却还在昏暗灯光下巧着那可怜的代码,突发想起公司连个月饼都舍不得给我这个"乞丐"扔一个,以前在学校我们都还有分,难道时代不同了????5555555真是气得我吐血了!!艾,忍吧!!!!我不入地狱谁入地狱啊!哈哈~~~~

原创粉丝点击