最近看了下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
分享到:
相关推荐
序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例...虽然你可以用你自己的各种各样的方法来保 存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
5.3 实施过程 5.3.1 任务一 使用serializable序列化实体对象 5.3.2 任务二 反序列化将Person对象从磁盘上读出 Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第9页。 5.3.1 任务一 使用...
反序列化deserialization是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来...
意义:序列化机制允许将实现序列化的Java对象转换为字节序列,并将字节序列保存在磁盘中,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使地对象可以脱离程序的运行而独立存在。 使用场景:所有在网络上...
NULL 博文链接:https://snowdymy.iteye.com/blog/1745396
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化机制在Java中有着广泛的应用,EJB、RMI等技术都是以此为基础的。 正确使用序列化机制 一般而言,要使得一个类可以序列化,只需简单实现java.io.Serializable接口即可(还要实现无参数的构造方法)。该...
Java反序列化漏洞学习实践中的代码 Java反序列化漏洞学习实践一:从Serializbale接口开始,...Java反序列化漏洞学习实践二:Java的反射机制(Java Reflection) Java反序列化漏洞学习实践三:理解java的动态代理机制
Java反射机制,实现json的序列化和反序列化
使用注意: 1. WebLogic反弹需要等5秒左右 2. 该工具为对外测试版,请尽量按照正常思路来用,比如... 体积更小,不再依赖java环境,但程序采用.net编写,需要.net 4.0环境 待完成: we blogic回显结果测试中,稍后加入
有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍
使用注意: 1. WebLogic反弹需要等5秒左右 2. 该工具为对外测试版,请尽量按照正常思路来用,比如... 体积更小,不再依赖java环境,但程序采用.net编写,需要.net 4.0环境 待完成: weblogic回显结果测试中,稍后加入
使用注意: 1. WebLogic反弹需要等5秒左右 2. 该工具为对外测试版,请尽量按照正常思路来用,比如... jboss回显执行命令部分利用异常抛出机制,本地(4.2.3.GA)测试成功,其他版本请自测 5. 体积更小,不再依赖java环
六、序列化和反序列化:解释了Java中序列化和反序列化的概念,以及通过实现Serializable接口进行对象的序列化和反序列化的过程。 七、内部类和匿名类:介绍了Java中的内部类和匿名类的概念,包括不同类型的内部类...
反序列化漏洞的本质是反序列化机制打破了数据和对象的边界,导致攻击者注入的恶意序列化数据在反序列化过程中被还原成对象,控制了对象可能在目标系统上面执行攻击代码,而不可信的输入和未检测反序列化对象的...
什么是Java的序列化和反序列化?为什么它们在分布式系统中很重要? 解释什么是Java的设计模式,并列举几个常用的设计模式及其应用场景。 这些题目涵盖了Java开发中的核心概念和常见问题,帮助您准备面试。祝您面试...
什么是Java的序列化和反序列化?为什么它们在分布式系统中很重要? 解释什么是Java的设计模式,并列举几个常用的设计模式及其应用场景。 这些题目涵盖了Java开发中的核心概念和常见问题,帮助您准备面试。祝您面试...
什么是Java的序列化和反序列化?为什么它们在分布式系统中很重要? 解释什么是Java的设计模式,并列举几个常用的设计模式及其应用场景。 这些题目涵盖了Java开发中的核心概念和常见问题,帮助您准备面试。祝您面试...
泛型 Java 泛型了解么?什么是类型擦除?...什么是反序列化? Java 序列化中如果有些字段不想进行序列化,怎么办? 获取用键盘输入常用的两种方法 Java 中 IO 流分为几种? 既然有了字节流,为什么还要有字符流?
如何实现Java序列化与反序列化.序列化和反序列化使用的API 如何实现Java中的一个对象中某一个属性不被序列化,如何实现呢? Java中堆内存和栈内存区别 讲一讲反射,主要是概念,都在哪需要反射机制 JSP中有个...