前言
理清楚java序列化的概念,了解序列化的原理。
一、no valid constructor错误复现?
1.代码
// 第一个类
public class Foo {
public Foo() {
System.out.println("Foo...");
}
}
// 第二个类
public class Foo1 extends Foo{
private Foo1() {
System.out.println("Foo1...");
}
public Foo1(int i) {
System.out.println("Foo1...");
}
}
// 第三个类
public class Foo2 extends Foo1 implements Serializable {
public Foo2() {
super(1);
System.out.println("Foo2...");
}
}
// main方法
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 序列化
Foo2 foo2 = new Foo2();
FileOutputStream fileOutputStream = new FileOutputStream("temp.o");
ObjectOutput objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(foo2);
// 反序列化
FileInputStream fileInputStream = new FileInputStream("temp.o");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
Foo2 foo2 = (Foo2)objectInputStream.readObject();
System.out.println(foo2);
}
2.执行结果
二、反序列化的时候父对象丢值?
1.代码
// 第一个类
public class Foo {
public Foo() {
System.out.println("Foo...");
}
}
// 第二个类
public class Foo1 extends Foo{
private int a;
public Foo1() {
System.out.println("Foo1...");
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
}
// 第三个类
public class Foo2 extends Foo1 implements Serializable {
public Foo2() {
System.out.println("Foo2...");
}
}
// main方法
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 序列化
Foo2 foo2 = new Foo2();
FileOutputStream fileOutputStream = new FileOutputStream("temp.o");
ObjectOutput objectOutputStream = new ObjectOutputStream(fileOutputStream);
foo2.setA(1000);
objectOutputStream.writeObject(foo2);
// 反序列化
FileInputStream fileInputStream = new FileInputStream("temp.o");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
foo2 = (Foo2)objectInputStream.readObject();
System.out.println(foo2.getA());
}
2. 执行结果
总结
对序列化错误的复现可以很好的理解序列化的底层原理。