麻烦先看一下代码,注意Blip2的构造方法,将对象Blip2序列化之后,反序列化的时候会报异常,如果Blip2的构造方法是public的就没有问题,请问这个怎么解释呢?
import java.io.*;
class Blip2 implements Externalizable {
Blip2() {
System.out.println("Blip2 Constructor");
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
System.out.println("Blip2.writeExternal");
}
@Override
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
System.out.println("Blip2.readExternal");
}
}
public class Blips {
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
System.out.println("Constructing objects:");
Blip2 b2 = new Blip2();
ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("Blips.out"));
System.out.println("Saving object:");
o.writeObject(b2);
o.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream("Blips.out"));
System.out.println("Recovering b2:");
b2 = (Blip2) in.readObject();
}
}
异常如下:Exception in thread "main" java.io.InvalidClassException: no valid constructor
defalut构造方法 异常
------解决方案--------------------
你这个序列化一点意义都没有,序列化只保存非静态的成员,不保存任何静态成员和方法,而且反序列化的时候构造方法是不会被调用的,可能因为没成员在序列化过程中保存,才导致了构造方法的调用吧。所以如果不声明为public会报错
------解决方案--------------------
反序列化不会调用构造方法啊,只是根据保存的信息去还原一块类存区
------解决方案--------------------
反序列化的时候先解析序列号出来的文件,解析出classname,根据classname来构造Blip2这个对象,构造的时候使用的是class.newInstance(),使用的时public的构造函数,你的时default的所以报错说no valid constructor