热门标签 | 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);
《序列化概念》


推荐阅读
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 编写SharePoint的EventReceiver需要用到ListTemplateID来进行绑定,下面的列表对于编程和排查错误都是个很好的索引.Listtem ... [详细]
  • DirectShow Filter 开发指南
    本文总结了 DirectShow Filter 的开发经验,重点介绍了 Source Filter、In-Place Transform Filter 和 Render Filter 的实现方法。通过使用 DirectShow 提供的类,可以简化 Filter 的开发过程。 ... [详细]
  • web页面报表js下载,web报表软件 ... [详细]
  • 用示例链接 Java 中的 hashset ... [详细]
  • 本文介绍了如何使用Aspose库将Office文件(如Word、PowerPoint)转换为HTML文件,并详细说明了在转换过程中可能出现的乱码问题及其解决方案。 ... [详细]
  • 2023年最新指南:如何在PHP中屏蔽警告和错误
    本文详细介绍了如何在PHP中屏蔽警告和错误,包括多种方法和最佳实践,帮助开发者提升代码质量和安全性。 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom"echarts";4、如果用到map(地图),还 ... [详细]
  • 使用Tkinter构建51Ape无损音乐爬虫UI
    本文介绍了如何使用Python的内置模块Tkinter来构建一个简单的用户界面,用于爬取51Ape网站上的无损音乐百度云链接。虽然Tkinter入门相对简单,但在实际开发过程中由于文档不足可能会带来一些不便。 ... [详细]
  • 本文介绍了 Python 中的基本数据类型,包括不可变数据类型(数字、字符串、元组)和可变数据类型(列表、字典、集合),并详细解释了每种数据类型的使用方法和常见操作。 ... [详细]
  • 使用HTML和JavaScript实现视频截图功能
    本文介绍了如何利用HTML和JavaScript实现从远程MP4、本地摄像头及本地上传的MP4文件中截取视频帧,并展示了具体的实现步骤和示例代码。 ... [详细]
  • 机器学习算法:SVM(支持向量机)
    SVM算法(SupportVectorMachine,支持向量机)的核心思想有2点:1、如果数据线性可分,那么基于最大间隔的方式来确定超平面,以确保全局最优, ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
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社区 版权所有