`

序列化

    博客分类:
  • j2se
阅读更多

序列化 (serialization)

  将对象的状态信息转换为可以存储或传输的窗体的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

  序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 SecurityPermission。在默认策略下,通过 Internet 下载的代码或 Intranet 代码不会授予该权限;只有本地计算机上的代码才被授予该权限。

  通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也与可访问性规则无关。

  对于任何可能包含重要的安全性数据的对象,如果可能,应该使该对象不可序列化。如果它必须为可序列化的,请尝试生成特定字段来保存不可序列化的重要数据。如果无法实现这一点,则应注意该数据会被公开给任何拥有序列化权限的代码,并确保不让任何恶意代码获得该权限。

  序列化

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

  序列化的目的:

  1、以某种存储形式使自定义对象持久化;

  2、将对象从一个地方传递到另一个地方。

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

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

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

 

---------------------------------------------------------------------------------------------------------------------------------

 

对象的序列化:把java对象转换为字节序列的过程;ObjectOutputStream.writeObject(Object obj);

对象的反序列化:把字节序列转换为java对象的过程。ObjectInputStream.readObject();

 

 

只 有实现了Serializable或者Externalizable接口的对象才能被序列化。 ObjectOutputStream.writeObject(Object obj)否则会抛出 IOException;Externalizable继承Serializable,实现Externalizable接口的类完全由自身来控制来控制 序列化的行为,而仅实现Serializable的类可以采用默认的序列化方式。JDK中如:String类,包装类,Date类实现了 Serializable接口。

 

 

为了能读出正确的数据,必须保证向对象输出流写对象的顺序与从对象输入流读对象的顺序一致。

 

 

ObjectOutputStream按照默认方式序列化,仅仅对对象的非transient的实例变量进行序列化,而不会对对象的transient变量进行序列化,也不会序列化静态变量。

 

如果一个对象存在一对多的关联关系,那么都会序列化。

 

控制序列化的行为:

如果用户希望控制类的序列化,可以在序列化类中提供以下形式的writeObject()方法和readObject()方法;

private void writeObject(ObjectOutputStream out) throws IOException

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException

 

采用自定义序列化方式的情况:

 

  1. 确保序列化的安全性,对敏感信息加密后再序列化,在反序列化的时候需要解密;
  2. 确保对象的成员变量符合正确的约束条件
  3. 优化序列化的性能。
  4. 便于更好的封装类的内部数据结构,确保类的接口不会被类的内部实现所束缚。

 

Externalizable:  

Externalizable接口继承自Serializable接口,如果一个类实现了Externalizable接口,那么将完全由这个类控制自身的序列化行为,Externalizable接口声明了两个方法:

  1. public void writeExternal(Objectoutput out)throws IOException  ===序列化
  2. public void readExternal(Objectinput in) throws IOException ClassNotFoundException  ===反序列化 ,当在反序列化时,会先调用类的不带参数的构造方法,这是有别于默认反序列化方式的。

 可序列化的不同版本的序列化兼容性:

凡是实现 Serializable接口的类都有一个表示序列化版本标识的静态常量,private static final longserialVersionUID; serialVersionUID的取值是java运行时环境根据类的内部细节自动生成的。如果对类的源码做了修改,再重新编译,新生成的类文件的 serialVersionUID的取值有可能会发生变化。

 

 

JDK 安装后,在它的bin目录下有一个serialver.exe 程序,用于查看实现了serializable接口的类的serialVersionUID。

 

 

序列化 的应用:

    * 1.        永久性保存对象,保存对象的字节序列到本地文件中;
    * 2.        通过序列化对象在网络中传递对象;
    * 3.        通过序列化在进程间传递对象。

分享到:
评论

相关推荐

    ASPNET中JSON的序列化和反序列化的方法

    在***中处理JSON的序列化和反序列化是Web开发中常见的需求。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,由于其简洁性和易于阅读性,被广泛用于服务器与客户端之间的数据传输。下面将详细介绍**...

    C++ JSON 序列化与反序列化

    本篇文章将深入探讨C++中JSON的序列化与反序列化。 **一、JSON序列化** 序列化是指将C++的对象转换为JSON字符串的过程,以便在网络上传输或保存到文件中。常见的C++ JSON序列化库有RapidJSON、nlohmann/json、...

    java 对象的序列化与反序列化

    Java对象的序列化和反序列化是Java编程中一项重要的技术,主要用于将对象的状态转换为字节流,以便存储或在网络上传输。这一过程对于理解Java的IO操作、持久化数据以及实现分布式通信等场景非常关键。 首先,我们来...

    XML序列化与反序列化 实战

    XML序列化与反序列化是.NET框架中处理数据交换的重要技术,它允许我们将对象的状态转换为XML格式的数据,也可以将XML数据恢复为等效的对象。这个实战项目专注于使用C#实现这一过程,使得开发者能够方便地在XML文件和...

    基于boost的序列化与反序列化

    在编程领域,序列化和反序列化是两个关键的概念,它们用于将对象的状态转换为可存储或可传输的格式,然后在需要时恢复为原始对象。Boost库提供了一个强大的工具——Boost.Serialization,来帮助程序员实现这个功能。...

    C#和Java的序列化反序列化

    在编程领域,序列化和反序列化是两个关键的概念,特别是在跨平台通信、持久化存储以及数据传输中扮演着重要角色。本篇文章将深入探讨C#和Java中的序列化与反序列化机制。 首先,我们要了解什么是序列化。序列化是指...

    序列化和反序列化的封装类

    在编程领域,序列化和反序列化是两个关键的概念,特别是在数据存储、网络传输和对象持久化等场景中。它们允许我们将对象的状态转换为字节流(序列化),然后在需要的时候将字节流还原为原来的对象(反序列化)。在C#...

    序列化和反序列化dll文件和proto

    在IT领域,序列化和反序列化是两个关键的概念,特别是在数据存储、网络通信和分布式系统中。它们涉及将对象的状态转换为可持久化的格式(序列化),以及将这种格式还原回原来的对象(反序列化)。本文将深入探讨这两...

    java序列化(Serializable)的作用和反序列化.doc

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...

    jackson json序列化,反序列化所需jar包

    Jackson是Java领域中广泛使用的JSON处理库,它提供了高效的JSON序列化和反序列化功能。在Java应用程序中,我们经常需要将Java对象转换为JSON字符串(序列化)或从JSON字符串恢复Java对象(反序列化),Jackson库就是...

    C#序列化与反序列化(包括复杂xml对象)

    在C#编程中,序列化和反序列化是两个关键的概念,它们主要用于对象状态的持久化和恢复。本文将深入探讨C#中的XML序列化和反序列化技术,包括如何将XML文档解析为对象,以及如何将对象转换回XML文档进行存储。我们将...

    hessian学习基础篇——序列化和反序列化

    在IT领域,序列化和反序列化是两个关键的概念,特别是在网络通信、数据持久化以及对象存储中。本文将深入探讨Hessian框架的基础知识,它是一个高效的二进制序列化协议,广泛应用于Java和.NET之间跨语言通信。通过...

    Unity 中使用Protobuf进行序列化和反序列化的Demo

    在Unity游戏引擎中,开发人员经常需要处理数据的序列化和反序列化,以便于存储、传输或网络通信。Protocol Buffers(Protobuf)是一种高效、跨平台的数据序列化协议,由Google开发。本Demo将展示如何在Unity中集成并...

    Json反序列化

    反序列化是将JSON格式的字符串转换为程序可直接使用的对象的过程,这对于处理网络请求返回的数据至关重要。在本篇文章中,我们将深入探讨JSON反序列化的概念、原因以及在实际开发中的应用。 一、什么是JSON反序列化...

    protobuf序列化和反序列化技术

    protobuf序列化和反序列化技术是大数据处理领域中不可或缺的一部分,尤其在实时大数据场景下,高效的数据传输和存储对性能有着直接影响。谷歌推出的Protocol Buffers(简称protobuf)是一种语言无关、平台无关的数据...

    java反序列化工具

    Java反序列化是一种将已序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种常见方式。在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络间传输对象。然而,这个过程也可能引入...

    C#对象序列化反序列化保存与读取和对象直接保存与读取

    本主题将深入探讨如何在Windows Forms(WF)环境中,利用C#语言进行对象的直接保存与读取,以及通过对象序列化和反序列化的方式实现对象的保存与恢复。 首先,我们来理解什么是对象的直接保存与读取。在C#中,可以...

    C#的控件使用:树形图TreeView如何实现序列化和反序列化.rar

    本教程将详细讲解如何在C#中实现`TreeView`控件的序列化和反序列化,这对于数据持久化和用户界面状态的保存至关重要。 首先,让我们了解序列化和反序列化的基本概念。**序列化**是将对象的状态转换为可存储或传输的...

    序列化窗体所有控件

    在编程领域,序列化是一种将对象的状态转换为可存储或可传输的形式的过程。这通常用于持久化数据,即保存对象的状态以便稍后恢复,或者在网络间传输对象。在这个主题“序列化窗体所有控件”中,我们主要关注的是如何...

    C# 数组与序列化

    在C#编程语言中,数组和序列化是两个非常重要的概念。数组是数据结构的基础,序列化则是数据传输和持久化的关键技术。接下来,我们将深入探讨这两个主题。 **数组** 数组是C#中用于存储固定数量同类型元素的集合。...

Global site tag (gtag.js) - Google Analytics