序列化概念

一、概述

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

.NET Framework 提供两种序列化技术:

  • 二进制序列化保持类型保真度,这对于在应用程序的不同调用之间保留对象的状态很有用。例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享对象。您可以将对象序列化到流、磁盘、内存和网络等等。远程处理使用序列化“通过值”在计算机或应用程序域之间传递对象。

  • XML 序列化仅序列化公共属性和字段,且不保持类型保真度。当您要提供或使用数据而不限制使用该数据的应用程序时,这一点是很有用的。由于 XML 是一个开放式标准,因此,对于通过 Web 共享数据而言,这是一个很好的选择。SOAP 同样是一个开放式标准,这使它也成为一个颇具吸引力的选择。

二、序列化的应用目的

为什么您想要使用序列化?有两个最重要的原因:

一个原因是将对象的状态永久保存在存储媒体中,以便可以在以后重新创建精确的副本;

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

三、二进制序列化

在二进制序列化过程中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,然后写入数据流。在以后反序列化该对象时,创建原始对象的精确复本。

使一个类可序列化的最简单方式是按如下所示使用 Serializable 属性标记。

 

[Serializable]
public   class  MyObject  {
  
public int n1 = 0;
  
public int n2 = 0;
  
public String str = null;
}

以下代码示例说明该类的实例是如何被序列化到一个文件中的。

 

MyObject obj  =   new  MyObject();
obj.n1 
=   1 ;
obj.n2 
=   24 ;
obj.str 
=   " Some String " ;
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(stream);
stream.Close();

//  Here's the proof.
Console.WriteLine( " n1: {0} " , obj.n1);
Console.WriteLine(
" n2: {0} " , obj.n2);
Console.WriteLine(
" str: {0} " , obj.str);

 

四、XML序列化

可以序列化的项

使用 XmLSerializer 类可将下列项序列化:

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

  • 实现 ICollection 或 IEnumerable 的类

  • XmlElement 对象

  • XmlNode 对象

  • DataSet 对象

使用 XML 序列化的好处

XmlSerializer 类在您将对象序列化为 XML 时为您提供完整而灵活的控制。如果您正在创建 XML Web 服务,则可以将控制序列化的属性应用于类和成员,以确保 XML 输出符合特定的架构。

例如,XmlSerializer 使您能够:

  • 指定应将字段或属性编码为特性还是元素。

  • 指定要使用的 XML 命名空间。

  • 如果字段或属性名不合适,指定元素或特性的名称。

XML 序列化的另一个好处是:只要生成的 XML 流符合给定的架构,对于所开发的应用程序就没有约束。 假定有这样一个用于描述图书的架构。该架构具有标题、作者、出版商和 ISBN 编号元素。您可以开发一个以您希望的任何方式(例如,作为图书订单或作为图书清单)处理 XML 数据的应用程序。在任何一种情况下,唯一的要求是 XML 流应当符合指定的 XML 架构定义语言 (XSD) 架构。

简单类的序列化

定义一个任意公共类:

public   class  OrderForm
{
    
public DateTime OrderDate;
}

序列化这个类的实例:

 

OrderForm myObject  =   new  OrderForm ();
myObject .OrderDate
= NOW;
//  Insert code to set properties and fields of the object.
XmlSerializer mySerializer  =   new  
XmlSerializer(
typeof (MySerializableClass));
//  To write to a file, create a StreamWriter object.
StreamWriter myWriter  =   new  StreamWriter( " myFileName.xml " );
mySerializer.Serialize(myWriter, myObject);
myWriter.Close();

反序列化这个类的实例:

 

OrderForm myObject;
//  Construct an instance of the XmlSerializer with the type
//  of object that is being deserialized.
XmlSerializer mySerializer  =  
new  XmlSerializer( typeof (MySerializableClass));
//  To read the file, create a FileStream.
FileStream myFileStream  =  
new  FileStream( " myFileName.xml " , FileMode.Open);
//  Call the Deserialize method and cast to the object type.
myObject  =  (MySerializableClass) ;
mySerializer.Deserialize(myFileStream);
MessageBox.Show(myObject.OrderDate);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值