package com.jingsong.test;
import lombok.Data;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.Serializable;
/**
* @author jingsong
* @date 2022/5/8 12:44
* @desc 记录一个rpc调用时产生的bug
*/
public class SerializableBug {
public static void main(String[] args) throws Exception {
// bug复现,简单模拟一下rpc调用
// 1. 将对象序列化
Dog dog = Dog.getADog();
String filePath = "D:/IdeaProjects/springboot/boot01/src/main/resources/data/dog";
/*ObjectOutputStream os = new ObjectOutputStream(
new FileOutputStream(filePath));
os.writeObject(dog);
os.close();*/
System.out.println(dog);
// 2. 反序列化
ObjectInputStream is = new ObjectInputStream(
new FileInputStream(filePath));
Dog fileDog = (Dog)is.readObject();
System.out.println(fileDog);
// 3. 将Home枚举中China删除掉后,再次反序列化出现java.io.InvalidObjectException
/*
4. 总结
a. 实际工作中本次bug出现的原因是:使用的jar包未及时更新,新jar包中出现新的枚举,导致序列化异常
b. 避免:①及时更新jar包 ②多写log排查问题 ③jar包发布功能尽量只增不减
*/
}
}
@Data
class Dog implements Serializable {
private static final long serialVersionUID = 8683452581122892189L;
private String name;
private Integer age;
private Home home;
public static Dog getADog(){
Dog dog = new Dog();
dog.setName("hehe");
dog.setAge(11);
dog.setHome(Home.China);
return dog;
}
}
enum Home{
China("中国"),
England("英国"),
Japan("日本")
;
private String desc;
Home(String desc) {
this.desc = desc;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
bug003_jar包变动引起的序列化bug
最新推荐文章于 2024-07-19 17:37:28 发布