最近看了下JAVA反序列化机制,发现它还是比想像中的要兼容些。不过还是有一些陷阱,跨语言跨平台的协议才是王道。
反序列化过程如下图:
几个关键点:
1.ObjectStreamClass的matchFields方法:此处会比较本地与序列化数据流中对象字段,对本地不存在的字段做过滤标识;如果本地存在同名但类型不同,则抛错。
2.readOrdinaryObject的处理:会调用ObjectStreamClass创建一个实例,但ObjectStreamClass只创建实例,不会调用类的构造方法,也就是说类似private int num = 10;的字段缺省值是不会被赋值的。
3. readOrdinaryObject完成从序列化流中读取值,对于标记过滤的字段跳过赋值;对于本地有而序列化流中没有的字段,不做赋值操作,也就是说该字段是类型的默认值(int为0对象为null)。
结合来说,使用JAVA序列化的几个注意点:
1、在只做添加、删除对象属性时,能做到兼容,但注意此时新加/删除字段的缺省值会丢失。(陷阱)
2、修改serialVersionUID值、变更属性类型,会不兼容。
3、枚举型添加成员能兼容,删除时无法兼容。但序列化与反序列化通常成对出现,一边是添加对另一边来说就是删除,此时需要小心判断。
另外,发现一点调试JDK代码的好办法,就是自己编译然后指定源码包,用默认的rt.jar调试时是看不到局部变量的值。
附1:JAVA序列化过程
1.将对象实例相关的类元数据输出。
2.递归地输出类的超类描述直到不再有超类。
3.类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值。
4.从上至下递归输出实例的数据
例子
public class
Parent {
int parentVersion
= 10;
}
class contain implements
Serializable{
int containVersion
= 11;
}
public class SerialTest
extends Parent implements Serializable {
int version
= 66;
contain con = new
contain();
public int
getVersion() {
return version;
}
}
·
协议、版本、新对象标识
·
对象类描述
·
属性version描述(类型、长度、名称)
·
属性con描述
·
父类(Parent )及父类属性描述
·
各个属性的值(parentVersion、version)
·
contain类的描述、属性描述及值
附2:反序列化时序图(未整理,画得比较乱)
- 大小: 22.5 KB
- 大小: 52.1 KB
- 大小: 11.3 KB
- 大小: 31.7 KB
分享到:
相关推荐
Java反序列化是一种将已序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种常见方式。在Java应用程序中,序列化用于将对象的状态转换为字节流,以便可以存储或在网络上传输。而反序列化则将这个字节...
Java反序列化是一种将之前序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种常见方法。在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络传输中将对象从一个系统传输到另一个...
Java 序列化和反序列化是 Java 语言中的一种机制,用于将对象转换为字节流,以便在网络上传输或存储。序列化是将对象转换为字节流的过程,而反序列化是将字节流转换回对象的过程。 在 Java 中,序列化和反序列化是...
1. Java反序列化机制的原理和风险 2. InvokerTransformer的使用和原理 3. ClassLoader的使用和原理 4. defineClass方法的使用和原理 5. ProtectionDomain的使用和原理 6. Java安全机制的实现和应用 应用场景: 1. ...
本篇文章将深入探讨C#和Java中的序列化与反序列化机制。 首先,我们要了解什么是序列化。序列化是指将对象的状态转化为可存储或可传输的数据格式的过程。这个过程通常将内存中的对象转换成字节流,以便保存到磁盘、...
Java反序列化安全漏洞是一种严重的安全威胁,它主要发生在Java程序处理序列化数据时。序列化是Java中的一种机制,可以将对象状态转换为字节流,以便存储或传输。反序列化则是将字节流恢复为Java对象的过程。 在Java...
**二、Java反序列化** 1. **什么是反序列化**:反序列化是将序列化的字节流恢复为原来的对象状态的过程。 2. **如何实现反序列化**:使用`ObjectInputStream`的`readObject()`方法从流中读取对象: ```java try ...
### Java反序列化实战知识点详解 #### 一、反序列化概述 - **定义**:在计算机科学领域,反序列化是指将字节流或文本流等数据转换回其原始对象结构的过程。这一过程通常与序列化相对应,序列化是将对象的状态转化...
然而,Java标准库提供的序列化机制效率较低且安全性欠佳,因此出现了许多第三方框架来优化这一过程。本篇将介绍几个常用的Java序列化和反序列化框架,并通过示例代码进行演示。 1. **Java标准序列化**: Java标准...
Java反序列化是Java编程语言中的一个特性,允许将对象的状态转换为字节流,然后在需要时恢复这些状态。这个过程通常用于持久化对象,网络传输或在不同应用程序之间共享数据。然而,由于设计上的漏洞,反序列化也可能...
序列化机制是Java提供的强大工具之一,可以帮助开发者轻松地保存和恢复对象的状态。 #### 二、序列化的应用场景 1. **文件保存**:当需要将内存中的对象状态保存到文件中或数据库中时,序列化非常有用。 2. **网络...
序列化机制使得Java对象能够在不同的平台之间进行传输,并且能够保持其原始状态。 **特点:** - **跨平台兼容性:** 序列化后的对象可以在不同的操作系统之间传输,无需担心数据格式或内存布局的不同。 - **对象...
在Android平台上,Java对象反序列化是一个常见的操作,它涉及到将序列化的数据转换回原来的对象实例。这在数据存储、网络通信以及跨进程通信(IPC)等场景中扮演着重要角色。本文将深入探讨Android上Java对象反序列...
在本项目中,“学生管理系统(序列化和反序列化)”是一个基于Java或类似编程语言实现的系统,其核心功能是有效地存储和恢复学生信息。序列化和反序列化是这个系统的关键技术,它们允许程序将对象的状态转化为可存储...
CommonsCollection1 反序列化链学习是 Java 反序列化攻击链中的一种,通过 CommonsCollection1 库的反序列化机制来实现攻击。为了深入了解 CommonsCollection1 反序列化链学习,需要具备一定的 Java 基础知识,包括...
在Java编程语言中,对象的序列化和反序列化是两个关键的概念,它们允许我们将对象的状态转换为可存储或传输的格式,然后再恢复为原始对象。这个过程对于数据持久化、网络传输以及跨进程通信等场景非常有用。下面将...
Java的序列化机制允许开发者在类中定义`readObject()`和`writeObject()`方法来自定义序列化和反序列化的行为,或者使用`transient`关键字来排除某些字段不参与序列化。 总之,Java序列化是一个强大的工具,它使得...
Java反序列化是Java编程中一个重要的概念,它与序列化相反,是将已序列化的对象状态转换回原来的对象实例的过程。序列化主要用于持久化对象,传输数据或跨进程通信。在Java中,`java.io.ObjectInputStream` 类是用于...
内容概要:本文详细介绍了Java反序列化的基本概念及其常见的攻击点,重点分析了反序列化过程中可能的安全风险及相应的防御方法。文中通过具体案例展示了如何利用代理模式进行反序列化攻击,探讨了高版本中利用JEP290...