java序列化的作用

合集下载

java序列化 python 解码

java序列化 python 解码

Java 序列化是将 Java 对象转换为字节流的过程,而 Python 中的解码通常是指将字节流还原为 Python 对象。在 Java 中,可以使用对象输出流(ObjectOutputStream)进行序列化,而在 Python 中,可以使用pickle模块进行反序列化。

以下是一个简单的示例,演示如何在 Java 中序列化对象,然后在 Python 中解码:Java 序列化(使用ObjectOutputStream):

Python 解码(使用pickle):

在这个例子中,Java 程序创建了一个Person对象并将其序列化到文件 "person.ser" 中。然后,Python 程序使用pickle模块从该文件中读取字节流,并将其反序列化为Python 对象。请确保 Java 和 Python 程序运行在相同的对象类定义下,以确保正确的序列化和反序列化。

Java序列化的几种方式以及序列化的作用

Java序列化的几种方式以及序列化的作用

Java序列化的⼏种⽅式以及序列化的作⽤

本⽂着重讲解⼀下Java序列化的相关内容。

如果对Java序列化感兴趣的同学可以研究⼀下。

⼀.Java序列化的作⽤

有的时候我们想要把⼀个Java对象变成字节流的形式传出去,有的时候我们想要从⼀个字节流中恢复⼀个Java对象。例如,有的时候我们想要把⼀个Java对象写⼊到硬盘或者传输到⽹路上⾯的其它计算机,这时我们就需要⾃⼰去通过java把相应的对象写成转换成字节流。对于这种通⽤的操作,我们为什么不使⽤统⼀的格式呢?没错,这⾥就出现了java的序列化的概念。在Java的OutputStream类下⾯的⼦类ObjectOutput-Stream类就有对应的WriteObject(Object object) 其中要求对应的object实现了java的序列化的接⼝。

为了更好的理解java序列化的应⽤,我举两个⾃⼰在开发项⽬中遇到的例⼦:

1)在使⽤tomcat开发JavaEE相关项⽬的时候,我们关闭tomcat后,相应的session中的对象就存储在了硬盘上,如果我们想要在tomcat重启的时候能够从tomcat上⾯读取对应session中的内容,那么保存在session中的内容就必须实现相关的序列化操作。

2)如果我们使⽤的java对象要在分布式中使⽤或者在rmi远程调⽤的⽹络中使⽤的话,那么相关的对象必须实现java序列化接⼝。

亲爱的⼩伙伴,⼤概你已经了解了java序列化相关的作⽤,接下来们来看看如何实现java的序列化吧。~

⼆.实现java对象的序列化和反序列化。

Java中实体类为什么要实现Serializable序列化的作用

Java中实体类为什么要实现Serializable序列化的作用

Java中实体类为什么要实现Serializable序列化的作⽤

客户端访问了某个能开启会话功能的资源, web服务器就会创建⼀个与该客户端对应的HttpSession对象,每个HttpSession对象都要站⽤⼀定的内存空间。如果在某⼀时间段内访问站点的⽤户很多,web服务器内存中就会积累⼤量的HttpSession对象,消耗⼤量的服务器内存,即使⽤户已经离开或者关闭了浏览器,web服务器仍要保留与之对应的HttpSession对象,在他们超时之前,⼀直占⽤web服务器内存资源。

web服务器通常将那些暂时不活动但未超时的HttpSession对象转移到⽂件系统或数据库中保存,服务器要使⽤他们时再将他们从⽂件系统或数据库中装载⼊内存,这种技术称为Session的持久化。

将HttpSession对象保存到⽂件系统或数据库中,需要采⽤序列化的⽅式将HttpSession对象中的每个属性对象保存到⽂件系统或数据库中;将HttpSession对象从⽂件系统或数据库中装载如内存时,需要采⽤反序列化的⽅式,恢复HttpSession对象中的每个属性对象。所以存储在HttpSession对象中的每个属性对象必须实现Serializable接⼝。

serialVersionUID 的作⽤

serialVersionUID ⽤来表明类的不同版本间的兼容性

Java的序列化机制是通过在运⾏时判断类的serialVersionUID来验证版本⼀致性的。在进⾏反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进⾏⽐较,如果相同就认为是⼀致的,可以进⾏反序列化,否则就会出现序列化版本不⼀致的异常。

什么是序列化_最终目的

什么是序列化_最终目的

什么是序列化_最终目的

序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据,那么你对序列化了解多少呢?以下是由店铺整理关于什么是序列化的内容,希望大家喜欢!

什么是序列化

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

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

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

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

序列化的目的

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

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

序列化与反序列化的原理以及利用和防御

序列化与反序列化的原理以及利用和防御

序列化与反序列化的原理以及利用和防御序列化和反序列化是计算机编程中常用的概念,用于将对象转换为字

节流以便存储或传输,以及将字节流转换回对象。在本文中,我将介绍序

列化和反序列化的原理、利用方式以及防御方法。首先,让我们先来了解

一下序列化和反序列化的原理。

序列化是指将对象转换为字节流的过程。在序列化过程中,对象的状

态信息(例如变量的值)会被编码成一个字节序列,以便存储或传输。序

列化可以简化对象的存储和传输,使得对象可以在不同的计算机和操作系

统之间进行通信或持久化存储。序列化通常涉及到将对象的属性和方法转

换为二进制数据,然后通过网络传输或存储到磁盘中。常见的序列化格式

有JSON、XML、二进制等。

反序列化是指将字节流转换回对象的过程。在反序列化过程中,字节

序列会被解码并还原为原始对象的状态信息。反序列化通常发生在接收到

序列化的数据之后,运行时会将字节流重新构建成对象。通过反序列化,

可以恢复对象的状态,并继续使用它们。

尽管序列化和反序列化提供了便利性,但它们也存在一些安全风险。

由于反序列化过程涉及到动态构建对象,恶意攻击者可以构造恶意序列化

数据,从而导致一些安全问题。以下是一些可能的利用方式:

1.远程代码执行:恶意序列化数据可以包含执行恶意代码的指令,当

对象被反序列化时,这些指令会被执行,导致攻击者可以在目标系统上执

行任意代码。

2.拒绝服务攻击:恶意序列化数据可以导致CPU和内存资源过度消耗,从而导致目标系统崩溃或变得不可用。

为了防止这些攻击,可以采取以下措施:

1.输入验证:在接收序列化数据之前,对输入数据进行验证和过滤。

序列化和反序列化的作用

序列化和反序列化的作用

序列化和反序列化的作用

序列化和反序列化是计算机中常见的数据处理技术,在数据传输、数据存储和数据交换等方面都有广泛的应用。序列化是将数据结构或对象转换成可存储或可传输的格式,而反序列化则是将数据格式转换回原始的数据结构或对象,以便进行后续的处理或使用。通过序列化和反序列化,可以方便地实现数据的跨平台、跨语言传输和存储,同时还可以提高数据传输的效率和安全性。在分布式系统、网络通信、数据库存储、消息队列等领域中,序列化和反序列化技术都扮演着重要的角色,为数据处理和应用带来了极大的便利性和灵活性。

- 1 -

数据序列化技术

数据序列化技术

数据序列化技术

数据序列化技术是一种将数据结构或对象转换为可传输或存储格式的技术,通常用于网络通信和跨平台数据交换。该技术能够将复杂的数据结构编码成二进制数据流,从而实现数据的传输和存储,同时还能够解码数据并还原成原始对象或数据结构。

在网络通信中,数据序列化技术可以将应用层协议中的数据结构转换为二进制格式,以便于在网络上传输。这样做的好处是可以提高传输效率和数据安全性,同时还能够兼容不同的编程语言和操作系统平台。

在跨平台数据交换中,数据序列化技术可以将不同语言和平台上的数据结构转换成统一的二进制格式,从而实现数据的互通和协作。这可以为软件系统的开发和集成提供更大的灵活性和可扩展性。

数据序列化技术主要包括两个方面:编码和解码。编码指将数据结构或对象编码为二进制格式,而解码则是将二进制格式的数据解析还原成原始数据结构或对象。下面主要介绍常见的数据序列化技术及其实现方式。

1. JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,由JavaScript 语言发明。它基于键值对的结构表示数据,具有易于阅读和编写的特点。JSON格式的数据可以在不同的编程语言和操作系统平台间互通。

在Java语言中,可以使用Gson框架实现JSON的编码和解码。Gson提供了一组API,可以将Java对象序列化为JSON格式的字符串或将JSON格式的字符串反序列化为Java对象。

下面是一个使用Gson对Java对象进行序列化和反序列化的例子:

```java

import com.google.gson.Gson;

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

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

java 序列化(Serializable)的作用和反序列化1、序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以 把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保 存 object states,但是 Java 给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。 2、什么情况下需要序列化 a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候; b)当你想用套接字在网络上传送对象的时候; c)当你想通过 RMI 传输对象的时候; 3、当对一个对象实现序列化时,究竟发生了什么? 在没有序列化前,每个保存在堆(Heap)中的对象都有相应的状态(state),即实例变 量(instance ariable)比如: java 代码 Foo myFoo = new Foo(); myFoo .setWidth(37); myFoo.setHeight(70); 当 通过下面的代码序列化之后,MyFoo 对象中的 width 和 Height 实例变量的值(37, 70)都被保存到 foo.ser 文件中,这样以后又可以把它 从文件中读出来,重新在堆中创建 原来的对象。当然保存时候不仅仅是保存对象的实例变量的值,JVM 还要保存一些小量信 息,比如类的类型等以便恢复原来的对 象。java 代码FileOutputStream fs = new FileOutputStream("foo.ser");ObjectOutputStream os = new ObjectOutputStream(fs);os.writeObject(myFoo);4、实现序列化(保存到一个文件)的步骤 a、Make a FileOutputStream java 代码 FileOutputStream fs = new FileOutputStream(“foo.ser”); b、Make a ObjectOutputStream java 代码ObjectOutputStream os = new ObjectOutputStream(fs);c、write the objectjava 代码os.writeObject(myObject1);os.writeObject(myObject2);os.writeObject(myObject3);d、 close the ObjectOutputStream

什么是序列化?序列化有什么作用?

什么是序列化?序列化有什么作用?

什么是序列化?序列化有什么作⽤?

⼀、序列化与反序列化

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

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

通常,对象实例的所有都会被序列化,这意味着数据会被表⽰为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,⽽不依赖于该成员的可访问性。

类似地,反序列化从序列化的表⽰形式中提取数据,并直接设置对象状态,这也与可访问性规则⽆关。

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

------------------------- 百度百科上⾯的解释

我觉得挺好的,我看了很多篇博客,都说的模棱两可,说指堆内存中的java对象数据,通过某种⽅式把对象存储到磁盘⽂件中,或者传递给其他⽹络节点(⽹络传输)。

java实体类中实现序列化接口有什么作用

java实体类中实现序列化接口有什么作用

java实体类中实现序列化接⼝有什么作⽤

⽬录

1. 序⾔

2. 序列化的⽬的?

2.1 场景:

3. java实现Serializable接⼝

4. serialVersionUID

4.1 private static final long serialVersionUID = 1L; 的意义

5. 为什么保存到数据库或者⽂件中要序列化?

1. 序⾔

实体类是没必须实现序列化接⼝的,实现的话可以⽤于通信之类的。

因为公司⽤的是JSON所以没有必要

protostuff 来完成java的序列化和反序列化?

2. 序列化的⽬的?

为了保存在内存中的各种对象的状态(也就是实例变量,不是⽅法),并且可以把保存的对象状态再读出来,这是java中的提供的保存对象状态的机制—序列化。

2.1 场景:

1、当想把的内存中的对象状态保存到⼀个⽂件中或者数据库中表(内存到数据库)

2、当想⽤套接字在⽹络上传送对象(⽹络传输)(或者不同线程之间通讯)

3、当想通过RMI传输对象的时候(分布式传输)

3. java实现Serializable接⼝

public interface Serializable {

}

其实并没有需要去实现的⽅法,相当于⼀个标识,可以被序列化。

⼀个java中的类只有实现了Serializable接⼝,它的对象才是可序列化的。

4. serialVersionUID

serialVersionUID的取值是Java运⾏时环境根据类的内部细节⾃动⽣成的。如果对类的源代码作了修改,再重新编译,新⽣成的类⽂件的serialVersionUID的取值有可能也会发⽣变化。

java实体类实现序列化

java实体类实现序列化

java实体类实现序列化遇到的问题:

⽤户注册注册了9个,在数据库中删除全部,之后再次注册,主键id直接变成10;

但是java实体类继承Serializable之后,问题就解决了。

那么问题来了,java实体类实现序列化有什么意义呢?

简述序列化的使用场景

简述序列化的使用场景

简述序列化的使用场景

序列化是将复杂的数据对象或者对象结构转换为可存储或传输的形式的过程。常见的使用场景有:1.网络传输:将数据对象或结构序列化后,可以用于网络传输;2.数据备份和恢复:通过序列化,可以方便的将数据对象保存在计算机中,以便数据的备份和恢复;3.持久化存储:将序列化后的数据对象保存在文件,可以方便的进行持久化存储。

java中序列化的作用

java中序列化的作用

java中序列化的作用

Java中序列化是将对象转换为字节序列的过程。序列化后的字节序列可以被传输到网络上或者保存到本地文件中,也可以在不同的Java虚拟机之间进行传输。序列化的作用主要有以下几个方面: 1. 对象的持久化存储:将对象序列化后可以将其保存到本地文件或数据库中,保证数据的持久化存储。

2. 分布式计算:在分布式计算环境中,Java对象需要在不同的机器之间传输,通过序列化可以将对象转换为字节序列进行传输。

3. 网络传输:通过网络传输对象时,需要将对象进行序列化,以便能够在网络上进行传输。

4. RPC(远程过程调用):在RPC中,远程调用需要将参数传递给远程服务器进行处理,通过序列化可以将参数转换为字节序列进行传输。

总之,Java中序列化是一种非常常见的技术,在Java的开发中有着广泛的应用。

- 1 -

java 解析 pickleserializer

java 解析 pickleserializer

java 解析 pickleserializer

在Java中,PickleSerializer是一种常用的序列化工具,它可以将对象转换为字节流,以便于存储和传输。同时,它也可以将字节流反序列化为对象,从而还原为原始对象。PickleSerializer在Java中广泛应用,如数据持久化、网络传输、文件存储等场景。本文将介绍Java中PickleSerializer的解析与应用。

一、PickleSerializer概述

PickleSerializer是一种基于Java的序列化工具,它可以将Java对象转换为字节流,以便于存储和传输。同时,它也可以将字节流反序列化为对象,从而还原为原始对象。PickleSerializer具有简单易用、高效稳定等特点,在Java中广泛应用。

二、PickleSerializer工作原理

PickleSerializer的工作原理是将Java对象转换为字节流,通过二进制编码表示对象的状态。在序列化过程中,PickleSerializer会根据对象的类型和结构,生成相应的字节流。在反序列化过程中,PickleSerializer会根据字节流的编码规则,将字节流还原为Java对象。

三、使用PickleSerializer进行序列化和反序列化

在Java中,使用PickleSerializer进行序列化和反序列化的步骤如下:

1. 导入PickleSerializer类:首先,需要导入PickleSerializer类,以便于使用它的序列化和反序列化方法。

2. 创建要序列化的对象:将要序列化的对象创建出来,并确保该对象实现了Serializable接口。

编程语言中的序列化类型详解

编程语言中的序列化类型详解

编程语言中的序列化类型详解

序列化是计算机科学中一个重要的概念,它指的是将对象转化为字节流的过程,以便在网络传输或存储中使用。在编程语言中,序列化类型是一种用于表示和处理序列化数据的特殊类型。本文将详细介绍编程语言中常见的序列化类型及其应用。

一、JSON(JavaScript Object Notation)

JSON是一种轻量级的数据交换格式,广泛应用于前后端数据交互和配置文件

的存储。它以人类可读的方式表示数据,并且易于解析和生成。JSON支持基本数

据类型,如字符串、数字、布尔值和null,以及复杂数据类型,如数组和对象。在

大多数编程语言中,都有现成的JSON库可以方便地进行序列化和反序列化操作。

二、XML(eXtensible Markup Language)

XML是一种标记语言,用于描述数据的结构和内容。它具有良好的可扩展性

和跨平台性,被广泛应用于Web服务、配置文件和文档存储。XML使用标签来定

义数据的结构,可以表示复杂的嵌套关系和属性信息。在编程语言中,通常使用XML解析库来处理XML数据的序列化和反序列化操作。

三、Protocol Buffers

Protocol Buffers是一种由Google开发的高效的二进制序列化格式。它通过定

义消息结构和字段类型来实现数据的序列化和反序列化。Protocol Buffers具有很高

的性能和紧凑的数据表示,适用于网络传输和存储。它支持多种编程语言,并且提供了丰富的特性,如字段的可选性、默认值和枚举类型。

四、MessagePack

MessagePack是一种基于二进制的轻量级序列化格式,具有类似JSON的数据

java中序列化的作用

java中序列化的作用

java中序列化的作⽤

⼀什么叫序列化

通俗点讲:它是处理对象流的⼀种机制,即可以很⽅便的保存内存中java对象的状态,同时也为了⽅便传输。

⼆序列化有什么作⽤

1.⽅便传输,速度快,还很安全,被调⽤⽅序列化,调⽤⽅反序列化即可拿到传输前最原始的java对象,常⽤于不同进程之间的对象传输

2.⽅便存储,不管是存储成⽂件还是数据库,都⾏,存储为⽂件,下回要⽤可以直接反序列拿到对象

三怎么序列化和反序列化

实现序列化接⼝就⾏(⾥⾯什么⽅法都没有,不⽤管的,只是⼀个标记接⼝⽽已)Serializable;

⾄于他们的代码怎么写,⽹上例⼦很多,随便搜⼀下就⾏了

四序列化时需要注意事项

为了不必要的报错⿇烦:序列化时最好是定义序列化版本id 即 public static final Long seriaVersionUID = 1L (默认) 或者 xxxxx L(⾃定义64位都⾏)

因为反序列化会判断序列化中的id和类中的id是否⼀样,如果不定义虽然会⾃动⽣成,但如果后⾯改了东西列,所以还是⾃觉点定义⼀个id,省去好多⿇烦

同时记住静态变量不会被序列化的,它可不在堆内存中,序列化只会序列化堆内存

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最近在阅读Core J2EE Patterns 的时候发现例子里用于在各个层次里进行传输的TO(Data Transfer Object)都实现了java.io.Serializable接口,看到这些偶突然感到茅塞顿开~困扰了很久的关于Serializable的疑问渐渐解开了,查找相关资料并总结如下:

序列化是什么:

序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。

序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例

序列化的什么特点:

如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。

什么时候使用序列化:

一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。

二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。

======================

可以看看接口java.io.serializable的中文解释:

Serializable

public interface Serializable

类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。

要允许不可序列化类的子类型序列化,可以假定该子类型负责保存和还原超类型的公用(public)、受保护的 (protected) 和(如果可访问)包 (package) 字段的状态。仅在子类型扩展的类有一个可访问的无参数构造方法来初始化该类的状态时,才可以假定子类型有此责任。如果不是这种情况,则声明一个类为可序列化类是错误的。该错误将在运行时检测到。

在反序列化过程中,将使用该类的公用或受保护的无参数构造方法初始化不可序列化类的字段。可序列化的子类必须能够访问无参数的构造方法。可序列化子类的字段将从该流中还原。

当遍历一个图形时,可能会遇到不支持可序列化接口的对象。在此情况下,将抛出NotSerializableException,并将标识不可序列化对象的类。

在序列化和反序列化过程中需要特殊处理的类必须使用下列准确签名来实现特殊方法:

private void writeObject(java.io.ObjectOutputStream out)

throws IOException

private void readObject(java.io.ObjectInputStream in)

throws IOException, ClassNotFoundException;

writeObject 方法负责写入特定类的对象的状态,以便相应的 readObject 方法可以还原它。通过调用 out.defaultWriteObject 可以调用保存 Object 的字段的默认机制。该方法本身不需要涉及属于其超类或子类的状态。状态是通过使用 writeObject 方法或使用DataOutput 支持的用于基本数据类型的方法将各个字段写入 ObjectOutputStream 来保存的。

readObject 方法负责从流中读取并还原类字段。它可以调用 in.defaultReadObject 来调用默认机制,以还原对象的非静态和非瞬态字段。defaultReadObject 方法使用流中的信息来分配流中通过当前对象中相应命名字段保存的对象的字段。这用于处理类发展后需要添加新字段的情形。该方法本身不需要涉及属于其超类或子类的状态。状态是通过使用writeObject 方法或使用 DataOutput 支持的用于基本数据类型的方法将各个字段写入ObjectOutputStream 来保存的。

将对象写入流时需要指定要使用的替代对象的可序列化类,应使用准确的签名来实现此特殊方法:

ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;

此 writeReplace 方法将由序列化调用,前提是如果此方法存在,而且它可以通过被序列化对象的类中定义的一个方法访问。因此,该方法可以拥有私有 (private)、受保护的(protected) 和包私有 (package-private) 访问。子类对此方法的访问遵循 java 访问规则。

在从流中读取类的一个实例时需要指定替代的类应使用的准确签名来实现此特殊方法。

ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;

此 readResolve 方法遵循与 writeReplace 相同的调用规则和访问规则。

序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致 InvalidClassException。可序列化类可以通过声明名为"serialVersionUID" 的字段(该字段必须是静态 (static)、最终 (final) 的 long 型字段)显式声明其自己的 serialVersionUID:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

如果可序列化类未显式声明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认 serialVersionUID 值,如“Java(TM) 对象序列化规范”中所述。不过,强烈建议所有可序列化类都显式声明 serialVersionUID 值,原因计算默认的serialVersionUID 对类的详细信息具有较高的敏感性,根据编译器实现的不同可能千差万别,这样在反序列化过程中可能会导致意外的 InvalidClassException。因此,为保证serialVersionUID 值跨不同 java 编译器实现的一致性,序列化类必须声明一个明确的serialVersionUID 值。还强烈建议使用 private 修改器显示声明 serialVersionUID(如果可能),原因是这种声明仅应用于立即声明类 -- serialVersionUID 字段作为继承成员没有用处。

java.io.Serializable引发的问题——什么是序列化?在什么情况下将类序列化?

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的

相关文档
最新文档