C#對象序列化應用淺析
C#對象序列化的應用:在寫程序的時候,想要保存一些對象。最初設計時的想法是才用xml來保存。實際編程過程中發(fā)現(xiàn)這還是挺繁瑣的,那么多的字段和屬性,還有各種組合的類。C#對象序列化應用的必要性:如果用xml來保存,嵌套多,嫌麻煩!最重要的是,我覺得使用XML來保存東西的話,那程序就被寫死了,在保存/讀取的時候,必須依據(jù)指定的元素的名或者屬性名什么的來操作。如果使用序列化,那所有的一切交給Serialzer來做就搞定了。我們只需要寫很少的代碼就可以完成這個工作。然后考慮使用xml序列化來保存,但是這XmlSerialzer只能保存公共字段,感覺有些不夠,就用二進制序列化了。對于某個需要進行序列化工作的類,在不繼承自接口ISerializable的情況下,通過增加[Serializable]屬性可以允許該類可以被序列化。
C#對象序列化應用實例:
- [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#對象序列化操作:
- 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ù)據(jù)都被保存到了Test.dat中。如果需要加載,則只需要反序列化:
- Car myCar=(Car)bf.Deserialize(fs);
對于多重繼承情況,使用序列化還是很方便的,盡管看起來比較傻。
子類的序列化操作在父類里完成,由于不可能給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;
- }
有了這些,在構造函數(shù)中,就可以直接從文件中加載了。
- public Car()
- {
- }
- public Car(string filename)
- {
- LoadFromFile(filename);
- }
對于某些不支持序列化操作的對象或者結構,MSDN中說Serialzer會自動辨別,只要無法序列化,會自動標記成[NonSerialzable],通過實際操作,發(fā)現(xiàn)還是需要手工標記。如:
- [NonSerialzable]
- private Microsoft.DirectX.Direct3D.Device pDevice;
如果對象里的不可序列化字段占據(jù)了絕大部分,那也就沒有什么必要進行序列化了。
C#對象序列化的基本內容就向你介紹到這里,希望對你了解和學習C#對象序列化有所幫助。
【編輯推薦】