日期:2014-05-20  浏览次数:20876 次

请教一个default的构造方法有关的问题
麻烦先看一下代码,注意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会报错
------解决方案--------------------
引用:
Quote: 引用:

你这个序列化一点意义都没有,序列化只保存非静态的成员,不保存任何静态成员和方法,而且反序列化的时候构造方法是不会被调用的,可能因为没成员在序列化过程中保存,才导致了构造方法的调用吧。所以如果不声明为public会报错
反序列化的时候不调用构造方法么?
反序列化不会调用构造方法啊,只是根据保存的信息去还原一块类存区
------解决方案--------------------
反序列化的时候先解析序列号出来的文件,解析出classname,根据classname来构造Blip2这个对象,构造的时候使用的是class.newInstance(),使用的时public的构造函数,你的时default的所以报错说no valid constructor