.NET序列化和反序列化基础知识总结
创始人
2024-06-06 15:20:57
0

.NET序列化和反序列化的学习中都会涉及到什么概念呢?在我们学习之前其实还是要明白问什么会有.NET序列化,它存在的必要性是什么?是如何实现的呢?那么下面我们逐一介绍

.NET序列化的概念:

“序列化”可被定义为将对象的状态存储到存储媒介中的过程。在此过程中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,然后写入数据流。在以后“反序列化”该对象时,创建原始对象的精确复本。

一、.NET序列化和反序列化的必要性

1、将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本;

2、通过值将对象从一个应用程序域发送到另一个应用程序域中。

例如,序列化可用于在 ASP.NET 中保存会话状态并将对象复制到 Windows 窗体的剪贴板中。远程处理还可以使用序列化通过值将对象从一个应用程序域传递到另一个应用程序域中。

二、如何实现.NET序列化和反序列化

1、要实现对象的序列化,首先要保证该对象可以序列化。而且,序列化只是将对象的属性进行有效的保存,对于对象的一些方法则无法实现序列化的。实现一个类可序列化的最简便的方法就是增加Serializable属性标记类。如:

  1. [Serializable()]  
  2. public class MEABlock  
  3. {  
  4. private int m_ID;  
  5. public string Caption;  
  6.  
  7. public MEABlock()  
  8. {  
  9. ///构造函数  
  10. }  
  11. }  

即可实现该类的可序列化。

2、要将该类的实例序列化为到文件中?.NET FrameWork提供了两种方法:

(1)XML序列化

使用 XmLSerializer 类,可将下列项序列化。

◆公共类的公共读/写属性和字段

◆实现 ICollection 或 IEnumerable 的类。(注意只有集合会被序列化,而公共属性却不会。)

◆XmlElement 对象。

◆XmlNode 对象。

◆DataSet 对象。

要实现上述类的实例的序列化,可参照如下例子:

  1. MEABlock myBlock = new MEABlock();  
  2. // Insert code to set properties and fields of the object.  
  3. XmlSerializer mySerializer = new XmlSerializer(typeof(MEABlock));  
  4. // To write to a file, create a StreamWriter object.  
  5. StreamWriter myWriter = new StreamWriter("myFileName.xml");  
  6. mySerializer.Serialize(myWriter, MEABlock); 

需要注意的是XML序列化只会将public的字段保存,对于私有字段不予于保存。生成的XML文件格式如下:

  1.  
  2. Test  
  3.  

对于对象的反序列化,则如下:

  1. MEABlock myBlock;  
  2. // Constructs an instance of the XmlSerializer with the type  
  3. // of object that is being deserialized.  
  4. XmlSerializer mySerializer = new XmlSerializer(typeof(MEABlock));  
  5. // To read the file, creates a FileStream.  
  6. FileStream myFileStream = new FileStream("myFileName.xml", FileMode.Open);  
  7. // Calls the Deserialize method and casts to the object type.  
  8. myBlock = (MEABlock)mySerializer.Deserialize(myFileStream) 

(2)二进制序列化

与XML序列化不同的是,二进制序列化可以将类的实例中所有字段(包括私有和公有)都进行序列化操作。这就更方便、更准确的还原了对象的副本。
要实现上述类的实例的序列化,可参照如下例子:

  1. MEABlock myBlock = new MEABlock();  
  2. // Insert code to set properties and fields of the object.  
  3. IFormatter formatter = new BinaryFormatter();  
  4. Stream stream = new FileStream(  
  5. "MyFile.bin",FileMode.Create,FileAccess.Write, FileShare.None);  
  6. formatter.Serialize(stream, myBlock);  
  7. stream.Close(); 

对于对象的反序列化,则如下:

  1. IFormatter formatter = new BinaryFormatter();  
  2. Stream stream = new FileStream("MyFile.bin",   
  3.  
  4. FileMode.Open,FileAccess.Read, FileShare.Read);  
  5. MEABlock myBlock = (MEABlock) formatter.Deserialize(stream);  
  6. stream.Close();  

三、如何变相实现自定义可视化控件的.NET序列化和反序列化

对于WinForm中自定义控件,由于继承于System.Windows.Form类,而Form类又是从MarshalByRefObject继承的,窗体本身无法做到序列化,窗体的实现基于Win32下GUI资源,不能脱离当前上下文存在。

当然可以采用变通的方法实现控件的序列化。这里采用的是记忆类模型。定义记忆类(其实就是一个可序列化的实体类)用于记录控件的有效属性,需要序列化控件的时候,只需要将该控件的实例Copy到记忆类,演变成序列化保存该记忆类的操作。

.NET反序列化是一个逆过程。将数据流反序列化成为该记忆类,再根据该记忆类的属性生成控件实例。而对于控件的一些事件、方法则可以继续使用。

.NET序列化和反序列化的基础概念和简单的实现过程就向你介绍到这里,希望对你了解和学习.NET序列化和反序列化有所帮助。

【编辑推荐】

  1. 走进C#基础概念之事件
  2. 详解C#中不同类的类型
  3. 浅谈C#中标准Dispose模式的实现
  4. C#图片处理的3种高级实用方法
  5. C# 4.0新特性:协变与逆变中的编程思想

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...