在java中反序列化单例

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都引用相同的引用,构造函数只被调用一次.

我在这里误解了这个概念吗?

请帮忙.

Phi*_*nov 8

在序列化期间,不会调用构造函数,通过反序列化过程或readObject()方法初始化字段(如果将此方法添加到类中).如果要实现可序列化的单例,则还应添加此处readResolve()所述的方法.


PS.
请记住,这getInstance()是一个静态的类方法Elvis,所以这样的调用e.getInstance()el.getInstance()等于Elvis.getInstance().