登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

学无止境

一点积累,与大家分享

 
 
 

日志

 
 

.net序列化及反序列化  

2010-08-03 09:43:58|  分类: .net技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

什么是序列化?
  ---.net的运行时环境用来支持用户定义类型的流化的机制。它是将对象实例的状态存储到存储媒体的过程。在此过程 中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与 原对象完全相同的副本。
  
  序列化的目的:
  1、以某种存储形式使自定义对象持久化;
  2、将对象从一个地方传递到另一个地方。
  
  实质上序列化机制是将类的值转化为一个一般的(即连续的)字节流,然后就可以将该流写到磁盘文件或任何其他流化目标上。而要想实际的写出这个流,就要使用那些实现了IFormatter接口的类里的Serialize和Deserialize方法。

1。 XML Serializer。这个是 ASP。NET 中 Web Service SOAP 请求的发送和接受默认使用的方式。指序列化对象的公共属性和成员。

2。 SOAP Serializer . DotNet Remoting 使用的对象传送方式。这个时候传送的对象要求有 Serializable 标志。

3.    BinarySerializer 。同2, 只不过是二进制格式。

在.net框架里提供了这样两个类:
  
  一、BinaryFormatter
  
   BinaryFormatter使用二进制格式化程序进行序列化。您只需创建一个要使用的流和格式化程序的实例,然后调用格式化程序的 Serialize 方法。流和要序列化的对象实例作为参数提供给此调用。类中的所有成员变量(甚至标记为 private 的变量)都将被序列化。
  
  首先我们创建一个类:
  [Serializable]
  public class MyObject {
   public int n1 = 0;
   public int n2 = 0;
   public String str = null;
  }
  Serializable属性用来明确表示该类可以被序列化。同样的,我们可以用NonSerializable属性用来明确表示类不能被序列化。
  接着我们创建一个该类的实例,然后序列化,并存到文件里持久:
  MyObject obj = new MyObject();
  obj.n1 = 1;
  obj.n2 = 24;
  obj.str = "一些字符串";
  IFormatter formatter = new BinaryFormatter();
  Stream stream = new FileStream("MyFile.bin", FileMode.Create,
  FileAccess.Write, FileShare.None);
  formatter.Serialize(stream, obj);
  stream.Close();
  
  而将对象还原到它以前的状态也非常容易。首先,创建格式化程序和流以进行读取,然后让格式化程序对对象进行反序列化。
  IFormatter formatter = new BinaryFormatter();
  Stream stream = new FileStream("MyFile.bin", FileMode.Open,
  FileAccess.Read, FileShare.Read);
  MyObject obj = (MyObject) formatter.Deserialize(fromStream);
  stream.Close();
  
  // 下面是证明
  Console.WriteLine("n1: {0}", obj.n1);
  Console.WriteLine("n2: {0}", obj.n2);
  Console.WriteLine("str: {0}", obj.str);
二 XmlSerializer  使用二进制格式化程序进行序列化。
    using System.Xml.Serialization;

  序列化

 XmlSerializer xml = new XmlSerializer(typeof(Test));
            FileStream fs = new FileStream(@"c:\t.xml",FileMode.Create);
            xml.Serialize(fs, t);
            fs.Close();

反序列化

FileStream fs = new FileStream(@"c:\t.xml", FileMode.Open);
            XmlSerializer xml = new XmlSerializer(typeof(Test));
            Test t = (Test)xml.Deserialize(fs);

XmlSerializer类和前两个主流的序列化类的几个不同点是:
  1、不需要Serializable属性,Serializable和NonSerializable属性将会被忽略,但是使用XmlIgnore属性,和NonSerializable属性类似。
  2、该类不能安全地访问私有变成员,所以学要将私有成员改为公共成员,或者提供合适的公共特性。
  3、要求被序列化的类要有一个默认的构造器。
三 SOAPSeriable

using System.Runtime.Serialization.Formatters.Soap;

 //序列化
            SoapFormatter soap = new SoapFormatter();
            FileStream fs = new FileStream(@"c:\test.xml", FileMode.Create);
            soap.Serialize(fs,new Test());
            fs.Close();
            Console.WriteLine("成功");
            //反序列化
            FileStream fs1= new FileStream(@"c:\test.xml", FileMode.Open);
            Test t = (Test)soap.Deserialize(fs1);
            Console.WriteLine(t.password);
            fs1.Close();

二进制序列化的优点:

  1. 所有的类成员(包括只读的)都可以被序列化;

  2. 性能非常好。

  XML序列化的优点:

  1. 互操作性好;

  2. 不需要严格的二进制依赖;

  3. 可读性强。

   通过分析上面的代码,我们知道了选择二进制序列化的方式还是选择XML序列化的方式仅仅是对不同的格式器进行选择而已。你可以根据实际的需要选择相应的 格式器完成序列化和反序列化工作。同时请注意,代码中的序列化函数和反序列化函数仅仅是在调用Serialize()和Deserialize()这两个 核心函数上产生了差别,即它们的参数不同。因此以上的代码完成了一些最最基本但是很重要的功能,你可以将它们运用在你的程序中,或是将其进行适当扩充以满 足程序的特定需要。
二.序列化机制对类的要求:
  评论这张
 
阅读(678)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018