Java序列化和反序列化相关应用技术及实例


(3)为什么要提供序列化 由于对象的寿命常随着生成该对象的程序的终止而终 止。 有时候可能需要将对象的状态保存下来,在需要时再 将对象恢复(精确的副本)以延续其状态; 也可能需要将对象从一个应用程序域发送到另一个应 用程序域中。
2、序列化的形式 (1)二进制序列化保持类型保真度 这对于在应用程序的不同调用之间保留对象的状态很 有用。 例如,通过将对象序列化到剪贴板,可在不同的应用 程序之间共享对象;也可以将对象序列化到流、磁盘、 内存和网络等等
Java序列化和反序列化 相关应用技术及实例
对象的序列化和反序列化技术
在本讲中您能了解如下知识点 对象的序列化技术 对象的反序列化技术 序列化的主要技术特点 相关的API 类与接口 对象的序列化应用实例
1、对象的序列化技术 (1)对象流:所谓的对象流也就是将对象的内容进行流化
可以对流化后的对象(如文件IO流)进行读写操作,也可将
5、在什么应用场合下考虑采用对象序列化的技术 (1)该类的对象是否需要跨应用程序域发送? (2)该类是否将与远程处理一起使用? (3)是否需要在另一种环境中实现对象的再生? (4)是否需要对对象的状态加以延续—-对象的持久化 6、序列化的主要技术特点 (1)如果某个类能够被序列化,其子类也可以被序列化。 (2)声明为static和transient类型的成员数据不能被序列 化 因为static代表类的状态,transient代表对象的临时数据。
(2)XML 序列化仅序列化公共属性和方法而不转换私有成 员变量,且不保留类型保真度 当希望提供或使用数据而不限制使用该数据的应用程 序时,这很有用 由于 XML 是一个开放式标准,因此在WebService技术 中的SOAP协议则是该应用 3、序列化分为两大部分:序列化和反序列化 (1)序列化 就是将数据分解成字节流(包括对象类型和版本等头 信息),以便存储在文件中或在网络上传输。 (2)反序列化 就是打开字节流并重构对象(JVM用头信息生成对象 实例,然后将对象字节流中的数据复制到对象数据成员 中)。
(3)对象保存的代码示例
构造需要保存的对象实例
保存对象实例到文件中, 从而实现序列化
9、实现反序列化过程的各个API (1)ObjectInput接口 它继承DataInput接口并且支持对象的序列化 其内的readObject()方法实现读取一个对象。
(2)ObjectInputStream类 它继承InputStream类并且实现ObjectInput接口。 利用该类来实现将对象存储(调用ObjectInput接口中 的readObject()方法)。
(2)ObjectOutputStream类 它继承OutputStream类并且实现ObjectOutput接口。 利用该类来实现将对象存储(调用ObjectOutput接口 中的writeObject()方法)。
注意: 也可以利用ObjectOutputStream类的对象写入其它基 本类型的数据值。 出错时将抛出IOException异常。
(3)编程要求 在Java平台中只有实现Serializable接口的类对象才 可以被序列化(因此Serializable接口属于支持序列 化的一个接口)。 Serializable接口没有定义任何成员,它只用来说明 某个类可以被序列化。
4、主要的应用 (1)在RMI、Socket、JMS、EJB等网络分布式的编程技术 应用方面都要使用该技术
流化后的对象传输于网络之间; 要想将对象传输于网络必须进行流化)!在对对象流进行读 写操作时会引发一些问题,而序列化机制正是用来解决这些 问题的
(2)序列化:序列化就是一种用来处对象流的机制
将一个对象的状态(各个属性量)保存起来,然后在适当
的时候再获得并对其进行恢复的过程; 其目的是为了实现对象的传输,同时也解决了对象引用的 问题。
因为它自动屏蔽了操作系统的差异,字节顺序等问题(比 如,在Window平台生成一个对象并序列化后,然后通过网络 传到一台Unix机器上,最后可以在这台Unix机器上正确地重 构出原来的对象)
(2)不同平台的程序之间相互通讯方面的应用 因为可以用java.io包中的各种字节流类将其保存到 文件中,管道到另一线程中或通过网络连接将对象数据 发送到另一主机
7、处理对象流的Java API (1)序列化实现过程 利用ObjectOutput接口和ObjectOutputStream类 (2)反序列化实现过程 利用ObjectInput接口和ObjectInputStream类
8、实现序列化过程的API (1)ObjectOutput接口 它继承DataOutput接口并且支持对象的序列化 其内的writeObject()方法实现存储一个对象。
注意: 也可以利用ObjectInputStream类的对象读取其它基 本类型的数据值,出错时将抛出IOException异常。
(3)读对象的代码示例
从文件中读取所保存的对 象,从而实现反序列化
10、对象序列化的应用实例 (1)用途 利用对象的序列化实现保存应用程序的当前工作状态, 下次再启动的时候将自动地恢复到上次执行的状态。 由于序列化本身就是允许一个对象在虚拟机之间传送 (或者经过一段空间,如在RMI中;或者经过一段时间, 比如数据流被保存到一个文件中)。
(2)实例WriteVectorObj.Java
(3)ReadVectorObj.java
本讲的简要回顾
1、子曰:“学而不思则罔,思而不学则殆。” “学而时习之”
2、子曰:“知之者不如好之者,好之者不如乐之者”
3、子曰:“三人行,必有我师焉”
4、子曰:“我非生而知之者,好古,敏以求之者也”
5、师者:“传道、授业和解惑”
合集下载

java序列化与反序列化的实例详解

java序列化与反序列化的实例详解

java序列化与反序列化的实例详解1.Java序列化与反序列化Java序列化是指把Java对象转换为字节序列的过程;⽽Java反序列化是指把字节序列恢复为Java对象的过程。

2.为什么需要序列化与反序列化我们知道,当两个进程进⾏远程通信时,可以相互发送各种类型的数据,包括⽂本、图⽚、⾳频、视频等,⽽这些数据都会以⼆进制序列的形式在⽹络上传送。

那么当两个Java进程进⾏通信时,能否实现进程间的对象传送呢?答案是可以的。

如何做到呢?这就需要Java序列化与反序列化了。

换句话说,⼀⽅⾯,发送⽅需要把这个Java对象转换为字节序列,然后在⽹络上传送;另⼀⽅⾯,接收⽅需要从字节序列中恢复出Java对象。

序列化简介Java 提供了⼀种对象序列化的机制,该机制中,⼀个对象可以被表⽰为⼀个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。

将序列化对象写⼊⽂件之后,可以从⽂件中读取出来,并且对它进⾏反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以⽤来在内存中新建对象。

整个过程都是 Java 虚拟机(JVM)独⽴的,也就是说,在⼀个平台上序列化的对象可以在另⼀个完全不同的平台上反序列化该对象。

类 ObjectInputStream 和 ObjectOutputStream 是⾼层次的数据流,它们包含序列化和反序列化对象的⽅法。

ObjectOutputStream 类包含很多写⽅法来写各种数据类型,但是⼀个特别的⽅法例外:publicfinalvoidwriteObject(Objectx)throwsIOException上⾯的⽅法序列化⼀个对象,并将它发送到输出流。

相似的 ObjectInputStream 类包含如下反序列化⼀个对象的⽅法:publicfinalObjectreadObject()throwsIOException, ClassNotFoundException该⽅法从流中取出⼀个对象,并将对象反序列化。

Hessian序列化和反序列化实现

Hessian序列化和反序列化实现

Hessian序列化和反序列化实现先聊聊 Java的序列化,Java官⽅的序列化和反序列化的实现被太多⼈吐槽,这得归于Java官⽅序列化实现的⽅式。

1、Java序列化的性能经常被吐槽。

2、Java官⽅的序列化后的数据相对于⼀些优秀的序列化的⼯具,还是要⼤不少,⽐如probuf,这⼤⼤影响存储和传输的效率。

3、Java序列化⼀定需要实现Serializable接⼝4、Java序列化的 serialVersionUID 也是个⼤坑另外,序列化和反序列化中还需要考虑:跨语⾔,新旧对象版本兼容,安全,性能。

今天主要来说说,Hessian2是如何来解决这些问题的?⼀、跨语⾔:hessian提供了⼀整套的byte[]的写⼊规范,这个规范为其他的语⾔实现hessian的序列化和反序列化提供了可能。

/doc/hessian-serialization.html⽬前hessian2已经⽀持了⾮常多语⾔,Java,Node,php,Erlang,c#.......⼆、新旧对象版本兼容:hessian2将类的描述信息写⼊byte[]中,以便于在反序列化时候能正常。

但是这样就带来了⼀个问题:序列化后的内容较⼤。

三、安全,hessian序列化时,会调⽤writeReplace⽅法得到⼀个新的对象,能将对象中的⼀些值进⾏加密后在进⾏序列化。

四、性能:hessian2的序列化在内容的序列化上做了⼀些优化,hessian2将需要序列化的多个相同的对象只会写⼊⼀次,其他⽤到该对象的只使⽤对象的引⽤,⽽不重新写⼊对象的描述信息和值信息。

但是hessian2在描述信息上写⼊的信息来兼容动态化的反序列化⽀持,所以内容相对于⼀些描述性的序列化⼯具(thrift,protobuf)来说,在性能上没有优势。

再回到序列化,相对于 Java来说,hessian的序列化从跨语⾔,新旧对象的版本兼容,安全以及性能⽅⾯都做的好,主要体现在:⼀、Java的序列化⽆法跨语⾔。

Java面试题详解Java中的序列化和反序列化

Java面试题详解Java中的序列化和反序列化

Java面试题详解Java中的序列化和反序列化Java中的序列化和反序列化序列化和反序列化是Java中重要的概念,用于实现对象的持久化和数据传输。

本文将详细解析Java中的序列化和反序列化的概念、使用方法以及相关注意事项。

一、序列化和反序列化的概念1. 序列化序列化是指将Java对象转换为字节流的过程,以便在网络传输或存储到文件中。

序列化使得对象能够被传输和保存,也可以在不同的平台和语言间进行通信和数据交换。

2. 反序列化反序列化是指将字节流转换为Java对象的过程。

反序列化是序列化的逆过程,通过反序列化可以将保存在文件或通过网络传输的字节流重新转化为Java对象。

二、Java中的序列化和反序列化实现方式Java中提供了两种主要的序列化和反序列化的实现方式:Serializable和Externalizable接口,并且默认的序列化机制是基于Serializable接口的。

1. Serializable接口Serializable接口是Java中的一个标记接口,实现该接口的类可以通过默认的序列化机制进行序列化和反序列化。

需要注意的是,实现Serializable接口的类的所有成员变量都将被序列化,包括私有成员变量。

2. Externalizable接口Externalizable接口继承自Serializable接口,是一个自定义序列化和反序列化机制的接口。

实现Externalizable接口的类必须实现writeExternal和readExternal两个方法,用于控制对象的序列化和反序列化过程。

相对于Serializable接口,Externalizable接口提供了更大的灵活性和性能上的优势。

三、序列化和反序列化的应用与注意事项1. 序列化的应用序列化主要应用于以下场景:- 对象的持久化:将对象保存到文件,以便在程序下次运行时恢复对象的状态。

- 远程方法调用:客户端和服务器之间传递Java对象。

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

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

序列化与反序列化的原理以及利⽤和防御1、序列化和反序列化的概念序列化:把对象转换为字节序列的过程称为对象的序列化。

反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

序列化就是把对象转换成字节流,便于保存在内存、⽂件、数据库中;反序列化即逆过程,由字节流还原成对象。

Java中的ObjectOutputStream类的writeObject()⽅法可以实现序列化,类ObjectInputStream类的readObject()⽅法⽤于反序列化。

下⾯是将字符串对象先进⾏序列化,存储到本地⽂件,然后再通过反序列化进⾏恢复如果Java应⽤对⽤户输⼊,即不可信数据做了反序列化处理,那么攻击者可以通过构造恶意输⼊,让反序列化产⽣⾮预期的对象,⾮预期的对象在产⽣过程中就有可能带来任意代码执⾏问题的根源在于类ObjectInputStream在反序列化时,没有对⽣成的对象的类型做限制;假若反序列化可以设置Java类型的⽩名单2、序列化的⽬的与⽤到序列化的情况当你想把的内存中的对象状态保存到⼀个⽂件中或者数据库中时候;当你想⽤套接字在⽹络上传送对象的时候;当你想通过RMI传输对象的时候;2.1对象序列化的步骤如下(1)创建对象输⼊流,它可以包装⼀个其他类型的⽬标输⼊流,例如:⽂件输出流。

(2)通过对象输⼊流的writeObject()⽅法写对象。

2.2.对象的反序列化如下:(1)创建对象输⼊流,同样的,可以包含其他类型的⽬标输出流,例如:⽂件输⼊流。

(2)通过对象输⼊流的readObject()⽅法读取对象。

3、漏洞挖掘基本⼿段:从可控数据的反序列化或间接的反序列化接⼝⼊⼿,在此基础上尝试构造序列化对象。

⾸先拿到⼀个Java应⽤,需要找到⼀个接受外部输⼊的序列化对象的接收点,即反序列化漏洞的触发点。

我们可以通过审计源码中对反序列化函数的调⽤(例如readObject())来寻找,也可以直接通过对应⽤交互流量进⾏抓包,查看流量中是否包含java序列化数据来判断,java序列化数据的特征为以标记(ac ed 00 05)开头。

Java中的序列化与反序列化技巧详解

Java中的序列化与反序列化技巧详解

Java中的序列化与反序列化技巧详解序列化与反序列化是Java中非常重要的概念和技术。

它们可以将对象转换为字节流,以便在网络上传输或者保存到文件中。

在本文中,我们将详细探讨Java中的序列化与反序列化技巧,包括如何实现序列化和反序列化,如何处理版本兼容性问题以及一些常见的注意事项。

一、序列化和反序列化的基本概念1. 序列化:将对象转换为字节流的过程称为序列化。

序列化后的字节流可以被保存到文件中或者通过网络传输。

2. 反序列化:将字节流转换为对象的过程称为反序列化。

反序列化可以从文件中读取字节流或者从网络中接收字节流。

3. Serializable接口:Java中的序列化和反序列化是通过Serializable接口实现的。

如果一个类实现了Serializable接口,那么它的对象可以被序列化和反序列化。

二、如何实现序列化和反序列化1. 实现Serializable接口:要使一个类可以被序列化,只需要让该类实现Serializable接口即可。

Serializable接口是一个标记接口,没有任何方法需要实现。

2. ObjectOutputStream和ObjectInputStream:Java提供了ObjectOutputStream和ObjectInputStream两个类来实现序列化和反序列化。

可以使用这两个类的writeObject()和readObject()方法来进行序列化和反序列化。

3. 序列化和反序列化的示例代码:```java// 序列化try {FileOutputStream fileOut = new FileOutputStream("object.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut);out.writeObject(object);out.close();fileOut.close();System.out.println("Serialized data is saved in object.ser");} catch (IOException i) {i.printStackTrace();}// 反序列化try {FileInputStream fileIn = new FileInputStream("object.ser");ObjectInputStream in = new ObjectInputStream(fileIn);Object object = (Object) in.readObject();in.close();fileIn.close();System.out.println("Deserialized data is loaded from object.ser"); } catch (IOException i) {i.printStackTrace();} catch (ClassNotFoundException c) {c.printStackTrace();}```三、版本兼容性问题的处理在进行序列化和反序列化时,可能会遇到版本兼容性的问题。

java序列化和serialVersionUID的使用方法实例

java序列化和serialVersionUID的使用方法实例

java序列化和serialVersionUID的使⽤⽅法实例java序列化和serialVersionUID的使⽤⽅法实例1、序列化:序列化可以将⼀个java对象以⼆进制流的⽅式在⽹络中传输并且可以被持久化到数据库、⽂件系统中,反序列化则是可以把之前持久化在数据库或⽂件系统中的⼆进制数据以流的⽅式读取出来重新构造成⼀个和之前相同内容的java对象。

2、序列化的作⽤:第⼀种:⽤于将java对象状态储存起来,通常放到⼀个⽂件中,使下次需要⽤到的时候再读取到它之前的状态信息。

第⼆种:可以让java对象在⽹络中传输。

3、序列化的实现:1)、需要序列化的类需要实现Serializable接⼝,该接⼝没有任何⽅法,只是标⽰该类对象可被序列化。

2)、序列化过程:使⽤⼀个输出流(如:FileOutputStream)来构造⼀个ObjectOutputStream(对象流)对象,接着,使⽤ObjectOutputStream对象的writeObject(Object obj)⽅法就可以将参数为obj的对象写出(即保存其状态)3)、反序列化过程:使⽤⼀个输⼊流(如:FileInputStream)来构造⼀个ObjectInputStream(对象流)对象,接着,使⽤ObjectInputStream对象的readObject(Object obj)⽅法就可以将参数为obj的对象读出(即获取其状态)4、静态long类型常量serialVersionUID的作⽤:如果没有设置这个值,你在序列化⼀个对象之后,改动了该类的字段或者⽅法名之类的,那如果你再反序列化想取出之前的那个对象时就可能会抛出异常,因为你改动了类中间的信息,serialVersionUID是根据类名、接⼝名、成员⽅法及属性等来⽣成⼀个64位的哈希字段,当修改后的类去反序列化的时候发现该类的serialVersionUID值和之前保存在问价中的serialVersionUID 值不⼀致,所以就会抛出异常。

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

java对象序列化与对象反序列化Java对象序列化与对象反序列化是Java中比较重要的一个技术,可以帮助开发者对Java对象进行持久化存储、传输以及分布式调用,保证Java程序的可靠性和安全性。

本文将从概念、原理、用途和实现方面介绍Java对象序列化与对象反序列化。

一、概念Java对象序列化是指将Java对象转换为二进制流的过程,可以用于将对象保存在硬盘或者网络传输。

序列化后的对象包含Java对象的数据和类信息,可以在反序列化后还原为原来的对象,对Java对象进行快速和方便的持久化存储和传输。

Java对象反序列化是指将序列化的二进制数据流还原为Java对象的过程。

在反序列化过程中,Java虚拟机通过读取序列化数据流,重建对象的状态和类信息。

反序列化后的对象可以直接使用,不需要重新编写或者初始化数据和类信息。

二、原理Java对象序列化与对象反序列化都是通过Java IO流实现的。

在序列化过程中,将Java对象的数据和类信息通过序列化流转换为字节流,可以用于保存到硬盘或传输。

在反序列化过程中,通过反序列化流读取序列化的字节流,反解析还原为Java对象。

Java对象序列化过程中,将Java对象的数据和类信息转换为二进制流,并将其传输到远程对象或存储到本地;反序列化过程中,将序列化的二进制流转换为Java对象,并还原对象的状态和类信息。

序列化和反序列化过程中需要考虑Java对象的类加载机制、安全性和性能等因素。

三、用途Java对象序列化和对象反序列化可以用于多种场景,如:1. 分布式计算中,用于远程方法调用(RMI)或远程(EJB)对象调用;2. 对象数据持久化,将Java对象保存到硬盘或数据库中,实现数据的持久化存储和读取;3. 网络数据传输,将Java对象通过网络传输,实现数据的跨机通信;4. 序列化数据缓存,将Java对象序列化后保存到缓存中,提高访问速度和性能。

Java对象序列化和对象反序列化广泛应用于面向对象的软件开发,保证Java程序的可靠性和安全性,并且使得Java程序具有良好的可扩展性和互操作性。

java对象的序列化以及反序列化详解

java对象的序列化以及反序列化详解⼀、概念序列化:把创建出来的对象(new出来的对象),以及对象中的成员变量的数据转化为字节数据,写到流中,然后存储到硬盘的⽂件中。

反序列化:可以把序列化后的对象(硬盘上的⽂件中的对象数据),读取到内存中,然后就可以直接使⽤对象。

这样做的好处是不⽤再⼀次创建对象了,直接反序列化就可以了。

使⽤场景:在创建对象并给所创建的对象赋予了值后,当前创建出来的对象是存放在堆内存中的,当JVM停⽌后,堆中的对象也被释放了,如果下⼀次想要继续使⽤之前的对象,需要再次创建对象并赋值。

然⽽使⽤序列化对象,就可以把创建出来的对象及对象中数据存放到硬盘的⽂件中,下次使⽤的时候不⽤在重新赋值,⽽是直接读取使⽤即可。

对象直接转换为字节的形式进⾏⽹络传输⼆、相关API介绍序列化序列化对象所属的类是ObjectOutputStream,如下图所⽰:说明:ObjectOutputStream类可以把对象及其数据写⼊到流中或⽹络中。

构造函数如下图所⽰:写出功能:反序列化反序列化对象所属的类是ObjectInputStream类:说明:序列化输出流对象和反序列化输出流对象都不具备读写能⼒,分别依赖FileOutputStream和FileInputStream类来进⾏读写⽂件。

构造函数如下图所⽰:读取功能:三、实战序列化需求:把Student类创建的对象持久化保存。

分析和步骤:1)⾃定义⼀个Student类,并定义name和age属性;2)定义⼀个测试类,在这个测试类中创建Student类的对象s;3)创建序列化对象objectOutputStream,同时创建输出流并关联硬盘上的⽂件;4)使⽤序列化对象objectOutputStream调⽤writeObject()函数持久化保存学⽣对象s;5)释放序列化对象流的资源;Student类如下:需要实现序列化接⼝Serializable,它是⼀个标记性接⼝。

java序列化与反序列化的使用方法汇总

java序列化与反序列化的使⽤⽅法汇总⼀、概念java对象序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再⽣成相同状态的对象。

对象序列化是对象持久化的⼀种实现⽅法,它是将对象的属性和⽅法转化为⼀种序列化的形式⽤于存储和传输。

反序列化就是根据这些保存的信息重建对象的过程。

序列化:将java对象转化为字节序列的过程。

反序列化:将字节序列转化为java对象的过程。

⼆、为什么要序列化和反序列化我们知道,当两个进程进⾏远程通信时,可以相互发送各种类型的数据,包括⽂本、图⽚、⾳频、视频等,⽽这些数据都会以⼆进制序列的形式在⽹络上传送。

那么当两个Java进程进⾏通信时,能否实现进程间的对象传送呢?答案是可以的。

如何做到呢?这就需要Java序列化与反序列化了。

换句话说,⼀⽅⾯,发送⽅需要把这个Java对象转换为字节序列,然后在⽹络上传送;另⼀⽅⾯,接收⽅需要从字节序列中恢复出Java对象。

当我们明晰了为什么需要Java序列化和反序列化后,我们很⾃然地会想Java序列化的好处。

其好处⼀是实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在⽂件⾥),⼆是,利⽤序列化实现远程通信,即在⽹络上传送对象的字节序列。

三、涉及到的javaAPI java.io.ObjectOutputStream表⽰对象输出流,它的writeObject(Object obj)⽅法可以对参数指定的obj对象进⾏序列化,把得到的字节序列写到⼀个⽬标输出流中。

java.io.ObjectInputStream表⽰对象输⼊流,它的readObject()⽅法源输⼊流中读取字节序列,再把它们反序列化成为⼀个对象,并将其返回。

只有实现了Serializable或Externalizable接⼝的类的对象才能被序列化,否则抛出异常。

四、序列化和反序列化的步骤序列化:步骤⼀:创建⼀个对象输出流,它可以包装⼀个其它类型的⽬标输出流,如⽂件输出流:ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(“⽬标地址路径”));步骤⼆:通过对象输出流的writeObject()⽅法写对象:out.writeObject("Hello");out.writeObject(new Date());反序列化:步骤⼀:创建⼀个对象输⼊流,它可以包装⼀个其它类型输⼊流,如⽂件输⼊流:ObjectInputStream in = new ObjectInputStream(new fileInputStream(“⽬标地址路径”));步骤⼆:通过对象输出流的readObject()⽅法读取对象:String obj1 = (String)in.readObject();Date obj2 = (Date)in.readObject();说明:为了正确读取数据,完成反序列化,必须保证向对象输出流写对象的顺序与从对象输⼊流中读对象的顺序⼀致。

JAVA反序列化安全实例解析

一、什么是序列化序列化 (Serialization)是指将对象的状态信息转换为可以存储或传输的形式的过程。

在序列化期间,对象将其当前状态写入到临时或持久性存储区。

以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

简单来说:序列化:将数据结构或对象转换成二进制串的过程序列化反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程反序列化下面是将字符串对象先进行序列化,存储到本地文件,然后再通过反序列化进行恢复的样例代码:public static void main(String args[]) throws Exception {String obj = “hello world!”;// 将序列化对象写入文件object.db中FileOutputStream fos = new FileOutputStream(“object.db”);ObjectOutputStream os = new ObjectOutputStream(fos);os.writeObject(obj);os.close();// 从文件object.db中读取数据FileInputStream fis = new FileInputStream(“object.db”);ObjectInputStream ois = new ObjectInputStream(fis);// 通过反序列化恢复对象objString obj2 = (String)ois.readObject();ois.close();}二、反序列化漏洞原理反序列化漏洞的本质就是反序列化机制打破了数据和对象的边界,导致攻击者注入的恶意序列化数据在反序列化过程中被还原成对象,控制了对象就可能在目标系统上面执行攻击代码。

Java 序列化应用于RMI JMX JMS 技术中。

三、漏洞危害案例一:Apache ActiveMQ 5.12.0 远程代码执行漏洞(JMS)Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序未能限制可在代理中序列化的类。

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