c#序列化与反序列化概述

本文介绍了C#中的序列化和反序列化概念及其三种实现方式:使用BinaryFormatter、SoapFormatter和XmlSerializer。通过实例展示了如何将对象转换为可存储或传输的形式,并在需要时还原。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c#序列化与反序列化概述
2010-07-11 14:32:33      我来说两句      
收藏     我要投稿

深入探讨C#序列化和反序列化之前我们先要明白什么是序列化,它又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。.NET框架提供了两种串行化的方式:1、是使用BinaryFormatter进行串行化;2、使用SoapFormatter进行串行化;3、使用XmlSerializer进行串行化。第一种方式提供了一个简单的二进制数据流以及某些附加的类型信息,而第二种将数据流格式化为XML存储;第三种其实和第二种差不多也是XML的格式存储,只不过比第二种的XML格式要简化很多(去掉了SOAP特有的额外信息)。可以使用[Serializable]属性将类标志为可序列化的。如果某个类的元素不想被序列化,1、2可以使用[NonSerialized]属性来标志,2、可以使用[XmlIgnore]来标志。

下面就让我们开始深入了解C#序列化和反序列化:

C#序列化和反序列化1、使用BinaryFormatter进行串行化

下面是一个可串行化的类:

   
  1. using System;  
  2. using System.Data;  
  3. using System.Configuration;  
  4. using System.Web;  
  5. using System.Web.Security;  
  6. using System.Web.UI;  
  7. using System.Web.UI.WebControls;  
  8. using System.Web.UI.WebControls.WebParts;  
  9. using System.Web.UI.HtmlControls;  
  10. using System.IO;  
  11. using System.Runtime.Serialization.Formatters.Binary;  
  12. /**//// ﹤summary﹥  
  13. /// ClassToSerialize 的摘要说明  
  14. /// ﹤/summary﹥  
  15. [Serializable]  
  16. public class ClassToSerialize  
  17. {  
  18. public int id = 100;  
  19. public string name = "Name";  
  20. [NonSerialized]  
  21. public string Sex = "男";  

下面是串行化和反串行化的方法:

   
  1. public void SerializeNow()  
  2. {  
  3. ClassToSerialize c = new ClassToSerialize();  
  4. FileStream fileStream =   
  5. new FileStream("c:\temp.dat", FileMode.Create);  
  6. BinaryFormatter b = new BinaryFormatter();  
  7. b.Serialize(fileStream, c);  
  8. fileStream.Close();  
  9. }  
  10. public void DeSerializeNow()  
  11. {  
  12. ClassToSerialize c = new ClassToSerialize();  
  13. c.Sex = "kkkk";  
  14. FileStream fileStream =  
  15.  new FileStream("c:\temp.dat",   
  16. FileMode.Open, FileAccess.Read, FileShare.Read);  
  17. BinaryFormatter b = new BinaryFormatter();  
  18. c = b.Deserialize(fileStream) as ClassToSerialize;  
  19.   Response.Write(c.name);  
  20. Response.Write(c.Sex);  
  21. fileStream.Close();  

调用上述两个方法就可以看到串行化的结果:Sex属性因为被标志为[NonSerialized],故其值总是为null。

C#序列化和反序列化2、使用SoapFormatter进行串行化

和BinaryFormatter类似,我们只需要做一下简单修改即可:

a.将using语句中的.Formatter.Binary改为.Formatter.Soap;

b.将所有的BinaryFormatter替换为SoapFormatter.

c.确保报存文件的扩展名为.xml

经过上面简单改动,即可实现SoapFormatter的串行化,这时候产生的文件就是一个xml格式的文件。

C#序列化和反序列化3、使用XmlSerializer进行串行化

关于格式化器还有一个问题,假设我们需要XML,但是不想要SOAP特有的额外信息,那么我们应该怎么办呢?有两中方案:要么编写一个实现IFormatter接口的类,采用的方式类似于SoapFormatter类,但是没有你不需要的信息;要么使用库类XmlSerializer,这个类不使用Serializable属性,但是它提供了类似的功能。

如果我们不想使用主流的串行化机制,而想使用XmlSeralizer进行串行化我们需要做一下修改:

a.添加System.Xml.Seriali

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值