C#對(duì)象序列化應(yīng)用淺析
C#對(duì)象序列化的應(yīng)用:在寫程序的時(shí)候,想要保存一些對(duì)象。最初設(shè)計(jì)時(shí)的想法是才用xml來保存。實(shí)際編程過程中發(fā)現(xiàn)這還是挺繁瑣的,那么多的字段和屬性,還有各種組合的類。C#對(duì)象序列化應(yīng)用的必要性:如果用xml來保存,嵌套多,嫌麻煩!最重要的是,我覺得使用XML來保存東西的話,那程序就被寫死了,在保存/讀取的時(shí)候,必須依據(jù)指定的元素的名或者屬性名什么的來操作。如果使用序列化,那所有的一切交給Serialzer來做就搞定了。我們只需要寫很少的代碼就可以完成這個(gè)工作。然后考慮使用xml序列化來保存,但是這XmlSerialzer只能保存公共字段,感覺有些不夠,就用二進(jìn)制序列化了。對(duì)于某個(gè)需要進(jìn)行序列化工作的類,在不繼承自接口ISerializable的情況下,通過增加[Serializable]屬性可以允許該類可以被序列化。
C#對(duì)象序列化應(yīng)用實(shí)例:
- [Serializable]
 - public class Car
 - {
 - private ArrayList _wheels=new ArrayList();
 - private ArrayList _Lights=new ArrayList();
 - public ArrayList Wheels
 - {
 - get{
 - return _wheels;
 - }
 - set{
 - _wheels=value;
 - }
 - }
 - public ArrayList Lights
 - {
 - get{
 - return _Lights;
 - }
 - set{
 - _Lights=value;
 - }
 - }
 - public Car
 - {
 - Wheel LeftWheel=new Wheel();
 - Wheel RightWheel=new Wheel();
 - _wheels.Add(LeftWheel);
 - _wheels.Add(RightWheel);
 - Light LeftLight=new Light();
 - Light RightLight=new Light();
 - _Lights.Add(LeftLight);
 - _Lights.Add(RightLight);
 - }
 - }
 - [Serialzable]
 - public class Wheel
 - {
 - public float Radius=0.5f;
 - }
 - [Serailzable]
 - public class Light
 - {
 - public float Price=200f;
 - }
 
C#對(duì)象序列化操作:
- Car myCar=new Car();
 - FileStream fs=null;
 - try
 - {
 - FileStream fs=new FileStream(
 - @"..\..\Test.dat",FileMode.Create);
 - BinaryFormatter bf=new BinaryFormatter();
 - bf.Serialize(fs,myCar);
 - }
 - catch(Exception e)
 - {
 - Messagebox.Show(e.Message);
 - }
 - finally
 - {
 - if(fs!=null)
 - fs.Close();
 - }
 
ArrayList是支持序列化的,通過以上操作,myCar實(shí)例的數(shù)據(jù)都被保存到了Test.dat中。如果需要加載,則只需要反序列化:
- Car myCar=(Car)bf.Deserialize(fs);
 
對(duì)于多重繼承情況,使用序列化還是很方便的,盡管看起來比較傻。
子類的序列化操作在父類里完成,由于不可能給this賦值,所以再在子類里操作父類里沒有的字段。
如Car的父類,Vehicle
- public abstract class Vehicle
 - {
 - private float _Weight;
 - private float _Height;
 - private float _Length;
 - public float Weight
 - {
 - get{return _Weight;}
 - set{_Weight=value;}
 - }
 - public float Height
 - {
 - get{return _Height;}
 - set{_Height=value;}
 - }
 - public float Length
 - {
 - get{retrun _Length;}
 - set{_Length=value;}
 - }
 - //在這里反序列化
 - public virtual Vehicle LoadFromFile(string filename)
 - {
 - //反序列化后給屬性賦值
 - obj=(Vehicle)bf.Deserialze(fs);
 - _Weight=obj.Weight;
 - _Length=obj.Length;
 - _Height=obj.Height;
 - return (Vehicle)obj;
 - }
 - }
 
在子類Car里
- public override Vehicle LoadFromFile(string filename)
 - {
 - //如果可以this=(Car)base.LoadFromFile(filename);
 - /那就好了,可以省很多。
 - Car car=(Car)base.LoadFromFile(filename);
 - _Wheels=car.Wheels;
 - _Lights=car.Lights;
 - return null;
 - }
 
子類Track
- public override Vehicle LoadFromFile(string filename)
 - {
 - Track track=(Track)base.LoadFromFile(filename);
 - _Capacity=track.Capacity;
 - }
 
有了這些,在構(gòu)造函數(shù)中,就可以直接從文件中加載了。
- public Car()
 - {
 - }
 - public Car(string filename)
 - {
 - LoadFromFile(filename);
 - }
 
對(duì)于某些不支持序列化操作的對(duì)象或者結(jié)構(gòu),MSDN中說Serialzer會(huì)自動(dòng)辨別,只要無法序列化,會(huì)自動(dòng)標(biāo)記成[NonSerialzable],通過實(shí)際操作,發(fā)現(xiàn)還是需要手工標(biāo)記。如:
- [NonSerialzable]
 - private Microsoft.DirectX.Direct3D.Device pDevice;
 
如果對(duì)象里的不可序列化字段占據(jù)了絕大部分,那也就沒有什么必要進(jìn)行序列化了。
C#對(duì)象序列化的基本內(nèi)容就向你介紹到這里,希望對(duì)你了解和學(xué)習(xí)C#對(duì)象序列化有所幫助。
【編輯推薦】















 
 
 




 
 
 
 