C#对象序列化应用浅析

C#对象序列化的应用:在写程序的时候,想要保存一些对象。最初设计时的想法是才用xml来保存。实际编程过程中发现这还是挺繁琐的,那么多的字段和属性,还有各种组合的类。C#对象序列化应用的必要性:如果用xml来保存,嵌套多,嫌麻烦!最重要的是,我觉得使用XML来保存东西的话,那程序就被写死了,在保存/读取的时候,必须依据指定的元素的名或者属性名什么的来操作。如果使用序列化,那所有的一切交给Serialzer来做就搞定了。我们只需要写很少的代码就可以完成这个工作。然后考虑使用xml序列化来保存,但是这XmlSerialzer只能保存公共字段,感觉有些不够,就用二进制序列化了。对于某个需要进行序列化工作的类,在不继承自接口ISerializable的情况下,通过增加[Serializable]属性可以允许该类可以被序列化。

创新互联-专业网站定制、快速模板网站建设、高性价比贾汪网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式贾汪网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖贾汪地区。费用合理售后完善,10年实体公司更值得信赖。

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实例的数据都被保存到了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;  

有了这些,在构造函数中,就可以直接从文件中加载了。

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

对于某些不支持序列化操作的对象或者结构,MSDN中说Serialzer会自动辨别,只要无法序列化,会自动标记成[NonSerialzable],通过实际操作,发现还是需要手工标记。如:

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

如果对象里的不可序列化字段占据了绝大部分,那也就没有什么必要进行序列化了。

C#对象序列化的基本内容就向你介绍到这里,希望对你了解和学习C#对象序列化有所帮助。

【编辑推荐】

  1. 学习C#泛型集合类型的心得体会
  2. .net泛型类的学习总结
  3. 深度剖析C#序列化和反序列化
  4. 深入探讨C#序列化和反序列化
  5. C# XML序列化应用浅析

名称栏目:C#对象序列化应用浅析
本文路径:http://www.shufengxianlan.com/qtweb/news37/283137.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联