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


推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • IneedtofocusTextCellsonebyoneviaabuttonclick.ItriedlistView.ScrollTo.我需要通过点击按钮逐个关注Tex ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文介绍如何在 Unity 的 XML 配置文件中,将参数传递给自定义生命周期管理器的构造函数。我们将详细探讨 CustomLifetimeManager 类的实现及其配置方法。 ... [详细]
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社区 版权所有