昨晚研究了一哈序列化問題,以前還以為是什麼高深的技術,故此經常是避而不用,避而不談,現在看來是我錯了哦!^_^ 其實在.NET中使用序列化是很簡單的事情了,希望我寫這點東西,對想研究這個的同胞們一個小小的提示吧!我覺得要掌握序列化問題,至少要明白以下幾點:
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://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>