C#对象序列化应用浅析

开发
C#对象序列化应用的理解是什么?C#对象序列化应用的必要性和优点是什么?C#对象序列化应用的具体实例是什么呢?那么本文就向你介绍这方面的内容。

C#对象序列化的应用:在写程序的时候,想要保存一些对象。最初设计时的想法是才用xml来保存。实际编程过程中发现这还是挺繁琐的,那么多的字段和属性,还有各种组合的类。C#对象序列化应用的必要性:如果用xml来保存,嵌套多,嫌麻烦!最重要的是,我觉得使用XML来保存东西的话,那程序就被写死了,在保存/读取的时候,必须依据指定的元素的名或者属性名什么的来操作。如果使用序列化,那所有的一切交给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实例的数据都被保存到了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序列化应用浅析
责任编辑:仲衡 来源: 博客园
相关推荐

2009-08-25 14:59:39

C# XML序列化应用

2009-09-09 15:54:48

C# XML序列化

2009-09-09 16:53:49

C# XmlSeria序列化

2009-08-24 17:14:08

C#序列化

2009-08-06 11:16:25

C#序列化和反序列化

2009-09-09 14:45:41

XML序列化和反序列化

2009-08-25 14:24:36

C#序列化和反序列化

2011-06-01 14:50:48

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

序列化反序列化

2018-03-19 10:20:23

Java序列化反序列化

2009-09-09 17:10:50

C# XML序列化

2023-11-13 23:06:52

Android序列化

2024-01-30 13:32:51

JSON反序列化序列化

2009-06-14 22:01:27

Java对象序列化反序列化

2012-04-13 10:45:59

XML

2009-09-09 17:14:24

XML序列化
点赞
收藏

51CTO技术栈公众号