试验目的:哪些情况会导致java反序列化失败。
持久化到本地
public class Test {
private static String file = "/serialFile.txt";
public static void main(String[] args)throws Exception {
write();
//read();
}
static void write() throws Exception{
FileOutputStream os = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(os);
Student s = new Student();
s.setAge(20);
s.setName("test");
s.setState(State.TEST);
oos.writeObject(s);
oos.close();
}
static void read() throws Exception{
FileInputStream is = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(is);
Student s = (Student)ois.readObject();
System.out.println(s);
}
}
class Student implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
State state;
String name;
String id;
int age;
public void setState(State state) {
this.state = state;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String toString(){
StringBuffer str = new StringBuffer();
str.append("state:").append(state != null ? state.getValue() : "error").append(" ");
str.append("name:" + name).append(" ");
str.append("age:" + age).append(" ");
str.append("id:" + id);
return str.toString();
}
}
public enum State {
COMMON(1),TEST(2);
private int value;
private State(int value){
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
1.枚举类型实例删除,反序列化会有问题
//将 Test实例删除
public enum State {
COMMON(1);
private int value;
private State(int value){
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
Exception in thread "main" java.io.InvalidObjectException: enum constant TEST does not exist in class com.my.test.serializable.State
at java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1704)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at com.my.test.serializable.Test.read(Test.java:34)
at com.my.test.serializable.Test.main(Test.java:16)
Caused by: java.lang.IllegalArgumentException: No enum const class com.my.test.serializable.State.TEST
at java.lang.Enum.valueOf(Enum.java:196)
at java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1702)
... 8 more
2.减少一个属性,和方法,执行read() ,不会有问题
减少以下代码
String name;
public void setName(String name) {
this.name = name;
}
3.增加属性和方法,执行read(),不会有问题
//增加
String id;
//增加
public String getId() {
return id;
}
//增加
public void setId(String id) {
this.id = id;
}
4.将private static final long serialVersionUID = 1L;变成2,执行read()
Exception in thread "main" java.io.InvalidClassException: com.my.test.serializable.Student;
local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at com.my.test.serializable.Test.read(Test.java:34)
at com.my.test.serializable.Test.main(Test.java:16)
部分结论:
1.反序列化时如果是减少或增加属性(包括枚举),方法,不会有问题
2.如果要反序列化枚举实例时,程序端有该枚举类型但没有该实例,则抛错。
3.如果反序列化时,程序端原枚举类型增加了新的实例且原实例存在,不会抛错.
4.序列化版本号不对,抛错。
分享到:
相关推荐
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
Java反序列化漏洞学习实践中的代码 Java反序列化漏洞学习实践一:从Serializbale接口开始,先弹个计算器 Java反序列化漏洞学习实践二:Java的反射机制(Java Reflection) Java反序列化漏洞学习实践三:理解java...
Java序列化机制(2)- serialVersionUID 实验 http://blog.csdn.net/suileisl/article/details/16991753
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
所以萌生了开发一个更加灵活的框架来扩展反序列化利用链,也就是当前这个试验品ysomap。 PS:YSOMAP项目为另一个项目的子项目,后续将开源该项目,敬请期待...... #2 原理 我将利用链切分成了两个部分payload和
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
在序列化过程中充分利用了成员实现的序列化反序列化方法,与在toString方法中调用成员的toString方法有异曲同工之妙 2.充分利用Java实现的API接口。比如在类Index中的getDictionary方法中,需要返回所有保存的Term,...
本实验主要介绍了 Java 中的输入输出流,包括 DataInputStream、DataOutputStream、PrintStream 等类的使用,以及对象的序列化和反序列化。通过实验,我们可以掌握流的概念分类、字符串常用操作方法、流的构造和应用...
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
Java实现数据库管理系统,可以通过控制台进行sql语句实现,用文件存储,用到了B+树和hash,用到了java的序列化和反序列化,对象流。
实验一对象序列化的说明1
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
序列化设计是指对系统中的数据进行序列化,以便在网络上传输或存储。序列化设计的目的是将数据转换成可以在网络上传输或存储的格式。序列化设计将影响系统的数据交换和存储。 文件存储设计 文件存储设计是指对系统...