热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

序列化概念

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

一、概述

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

.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);
《序列化概念》


推荐阅读
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • 本文探讨如何利用Java反射技术来模拟Webwork框架中的URL解析过程。通过这一实践,读者可以更好地理解Webwork及其后续版本Struts2的工作原理,尤其是它们在MVC架构下的角色。 ... [详细]
  • 深入理解String.Format()方法的应用
    在.NET框架中,String.Format()方法是一种非常实用的工具,它能够帮助开发者以灵活多样的方式格式化字符串。本文将通过一个具体的示例,详细介绍如何利用String.Format()方法处理数值、日期时间和枚举类型的格式化。 ... [详细]
  • 本文详细介绍了如何在Android应用中使用GridView组件以网格形式展示数据(如文本和图像)。通过行列布局,实现类似矩阵的数据展示效果。 ... [详细]
  • 本文探讨了浏览器的同源策略限制及其对 AJAX 请求的影响,并详细介绍了如何在 Spring Boot 应用中优雅地处理跨域请求,特别是当请求包含自定义 Headers 时的解决方案。 ... [详细]
  • 本文介绍了在Android项目中实现时间轴效果的方法,通过自定义ListView的Item布局和适配器逻辑,实现了动态显示和隐藏时间标签的功能。文中详细描述了布局文件、适配器代码以及时间格式化工具类的具体实现。 ... [详细]
  • 深入解析ES6至ES8的新特性与应用
    本文详细介绍了自2015年发布的ECMAScript 6.0(简称ES6)以来,JavaScript语言的多项重要更新,旨在帮助开发者更好地理解和利用这些新特性进行复杂应用的开发。 ... [详细]
  • js常用方法(1)startWithJava代码varstartsWithfunction(str,regex){if(regexundefined||strundefined|| ... [详细]
  • MapReduce原理是怎么剖析的
    这期内容当中小编将会给大家带来有关MapReduce原理是怎么剖析的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 ... [详细]
  • sqlserver动态分区方案例子
    sqlserver动态分区方案例子当我们存储的数据量比较大时,比如超过千万,上亿级别时单纯的使用索引可能效果不明显了,此时我们可以考虑采 ... [详细]
  • Ubuntu GamePack:专为游戏爱好者打造的Linux发行版
    随着Linux系统在游戏领域的应用越来越广泛,许多Linux用户开始寻求在自己的系统上畅玩游戏的方法。UALinux,一家致力于推广GNU/Linux使用的乌克兰公司,推出了基于Ubuntu 16.04的Ubuntu GamePack,旨在为Linux用户提供一个游戏友好型的操作环境。 ... [详细]
  • 本文探讨了如何利用System.Diagnostics.Trace作为.NET库中的通用日志记录方法,同时考虑了其在性能关键代码中的影响。 ... [详细]
  • ˂p优秀的马里奥YouprobablywanttomakethecreationoftheformuladynamicsoeachrowofCta ... [详细]
  • Django xAdmin 使用指南(第一部分)
    本文介绍如何在Django项目中集成和使用xAdmin,这是一个增强版的管理界面,提供了比Django默认admin更多的功能。文中详细描述了集成步骤及配置方法。 ... [详细]
  • 本文介绍了一个项目中如何在Windows平台上实现多声道音频数据的采集,特别是针对DANTE音频接口的8路立体声音频通道。文章详细描述了使用Windows底层音频API进行音频采集的方法,并提供了一个具体的实现示例。 ... [详细]
author-avatar
shyaiqq
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有