自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#對象序列化應用淺析

開發(fā)
C#對象序列化應用的理解是什么?C#對象序列化應用的必要性和優(yōu)點是什么?C#對象序列化應用的具體實例是什么呢?那么本文就向你介紹這方面的內容。

C#對象序列化的應用:在寫程序的時候,想要保存一些對象。最初設計時的想法是才用xml來保存。實際編程過程中發(fā)現(xiàn)這還是挺繁瑣的,那么多的字段和屬性,還有各種組合的類。C#對象序列化應用的必要性:如果用xml來保存,嵌套多,嫌麻煩!最重要的是,我覺得使用XML來保存東西的話,那程序就被寫死了,在保存/讀取的時候,必須依據(jù)指定的元素的名或者屬性名什么的來操作。如果使用序列化,那所有的一切交給Serialzer來做就搞定了。我們只需要寫很少的代碼就可以完成這個工作。然后考慮使用xml序列化來保存,但是這XmlSerialzer只能保存公共字段,感覺有些不夠,就用二進制序列化了。對于某個需要進行序列化工作的類,在不繼承自接口ISerializable的情況下,通過增加[Serializable]屬性可以允許該類可以被序列化。

C#對象序列化應用實例:

  1. [Serializable]  
  2. public class Car  
  3. {  
  4.     private ArrayList _wheels=new ArrayList();  
  5.     private ArrayList _Lights=new ArrayList();  
  6.     public ArrayList Wheels  
  7.     {  
  8.     get{  
  9.     return _wheels;  
  10.     }  
  11.     set{  
  12.     _wheels=value;  
  13.     }  
  14.     }  
  15.     public ArrayList Lights  
  16.     {  
  17.     get{  
  18.     return _Lights;  
  19.     }  
  20.     set{  
  21.     _Lights=value;  
  22.     }  
  23.     }  
  24.     public Car  
  25.     {  
  26.     Wheel LeftWheel=new Wheel();  
  27.     Wheel RightWheel=new Wheel();  
  28.     _wheels.Add(LeftWheel);  
  29.     _wheels.Add(RightWheel);  
  30.     
  31.     Light LeftLight=new Light();  
  32.     Light RightLight=new Light();  
  33.     _Lights.Add(LeftLight);  
  34.     _Lights.Add(RightLight);  
  35.     }  
  36. }  
  37. [Serialzable]  
  38. public class Wheel  
  39. {  
  40. public float Radius=0.5f;  
  41. }  
  42. [Serailzable]  
  43. public class Light  
  44. {  
  45. public float Price=200f;  

C#對象序列化操作:

  1. Car myCar=new Car();  
  2. FileStream fs=null;  
  3. try 
  4. {  
  5. FileStream fs=new FileStream(  
  6. @"..\..\Test.dat",FileMode.Create);  
  7. BinaryFormatter bf=new BinaryFormatter();  
  8. bf.Serialize(fs,myCar);  
  9. }  
  10. catch(Exception e)  
  11. {  
  12. Messagebox.Show(e.Message);  
  13. }  
  14. finally 
  15. {  
  16. if(fs!=null)  
  17. fs.Close();  

ArrayList是支持序列化的,通過以上操作,myCar實例的數(shù)據(jù)都被保存到了Test.dat中。如果需要加載,則只需要反序列化:

  1. Car myCar=(Car)bf.Deserialize(fs); 

對于多重繼承情況,使用序列化還是很方便的,盡管看起來比較傻。

子類的序列化操作在父類里完成,由于不可能給this賦值,所以再在子類里操作父類里沒有的字段。

如Car的父類,Vehicle

  1. public abstract class Vehicle  
  2. {  
  3. private float _Weight;  
  4. private float _Height;  
  5. private float _Length;  
  6. public float Weight  
  7. {  
  8. get{return _Weight;}  
  9. set{_Weight=value;}  
  10. }  
  11. public float Height  
  12. {  
  13. get{return _Height;}  
  14. set{_Height=value;}  
  15. }  
  16. public float Length  
  17. {  
  18. get{retrun _Length;}  
  19. set{_Length=value;}  
  20. }  
  21. //在這里反序列化  
  22. public virtual Vehicle LoadFromFile(string filename)  
  23. {  
  24.  //反序列化后給屬性賦值  
  25.  obj=(Vehicle)bf.Deserialze(fs);  
  26.  _Weight=obj.Weight;  
  27.  _Length=obj.Length;  
  28.  _Height=obj.Height;  
  29.     
  30.  return (Vehicle)obj;  
  31. }  

在子類Car里

  1. public override Vehicle LoadFromFile(string filename)  
  2. {  
  3. //如果可以this=(Car)base.LoadFromFile(filename);  
  4. /那就好了,可以省很多。  
  5. Car car=(Car)base.LoadFromFile(filename);  
  6. _Wheels=car.Wheels;  
  7. _Lights=car.Lights;  
  8. return null;  

子類Track

  1. public override Vehicle LoadFromFile(string filename)  
  2. {  
  3. Track track=(Track)base.LoadFromFile(filename);  
  4. _Capacity=track.Capacity;  

有了這些,在構造函數(shù)中,就可以直接從文件中加載了。

  1. public Car()  
  2. {  
  3. }  
  4.  
  5. public Car(string filename)  
  6. {  
  7. LoadFromFile(filename);  
  8. }  

對于某些不支持序列化操作的對象或者結構,MSDN中說Serialzer會自動辨別,只要無法序列化,會自動標記成[NonSerialzable],通過實際操作,發(fā)現(xiàn)還是需要手工標記。如:

  1. [NonSerialzable]  
  2. private Microsoft.DirectX.Direct3D.Device pDevice; 

如果對象里的不可序列化字段占據(jù)了絕大部分,那也就沒有什么必要進行序列化了。

C#對象序列化的基本內容就向你介紹到這里,希望對你了解和學習C#對象序列化有所幫助。

【編輯推薦】

  1. 學習C#泛型集合類型的心得體會
  2. .net泛型類的學習總結
  3. 深度剖析C#序列化和反序列化
  4. 深入探討C#序列化和反序列化
  5. C# XML序列化應用淺析
責任編輯:仲衡 來源: 博客園
相關推薦

2009-08-25 14:59:39

C# XML序列化應用

2009-09-09 16:53:49

C# XmlSeria序列化

2009-09-09 15:54:48

C# XML序列化

2009-08-24 17:14:08

C#序列化

2009-08-06 11:16:25

C#序列化和反序列化

2009-08-25 14:24:36

C#序列化和反序列化

2011-06-01 14:50:48

2009-09-09 14:45:41

XML序列化和反序列化

2024-05-06 00:00:00

C#序列化技術

2009-08-25 14:43:26

C#序列化和反序列化

2024-03-05 12:49:30

序列化反序列化C#

2009-09-09 16:30:59

C# BinaryFo

2022-07-27 22:36:16

ThriftRPC開源

2011-06-01 15:05:02

序列化反序列化

2009-09-09 17:10:50

C# XML序列化

2018-03-19 10:20:23

Java序列化反序列化

2024-01-30 13:32:51

JSON反序列化序列化

2023-11-13 23:06:52

Android序列化

2009-06-14 22:01:27

Java對象序列化反序列化

2009-09-09 17:14:24

XML序列化
點贊
收藏

51CTO技術棧公眾號