Ven*_*eki 8 java serialization
我正在阅读Effective Java,并且遇到了这个例子.
class Elvis implements Serializable {
public static final Elvis inst = new Elvis();
private Elvis() {
System.out.println("In elvis constructor ");
}
public static Elvis getInstance() {
return inst;
}
}
Run Code Online (Sandbox Code Playgroud)
根据这本书,当我反序列化时,应该构造一个新的ELVIS对象,但是我看到在反序列化时没有调用构造函数?
这是我的代码序列化和反序列化.
FileOutputStream fos = new FileOutputStream("myserial1.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Elvis e = Elvis.getInstance();
System.out.println(" e = "+e.getInstance());
oos.writeObject(e);
System.out.println("Serialization done.");
FileInputStream fis = new FileInputStream("myserial1.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Elvis el = (Elvis) ois.readObject();
System.out.println(" el = "+el.getInstance());
Run Code Online (Sandbox Code Playgroud)
我看到e和e1都引用相同的引用,构造函数只被调用一次.
我在这里误解了这个概念吗?
请帮忙.
在序列化期间,不会调用构造函数,通过反序列化过程或readObject()方法初始化字段(如果将此方法添加到类中).如果要实现可序列化的单例,则还应添加此处readResolve()所述的方法.
PS.
请记住,这getInstance()是一个静态的类方法Elvis,所以这样的调用e.getInstance()和el.getInstance()等于Elvis.getInstance().