java - 在java中反序列化一个单例

标签 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;
    }
}

按照书上的说法,反序列化的时候应该构造一个新的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());

我看到 e 和 e1 都引用了相同的引用,并且构造函数只被调用一次。

我是不是误解了这里的概念?

请帮忙。

最佳答案

在序列化过程中没有构造函数被调用,字段被反序列化过程或readObject() method初始化(如果您将此方法添加到您的类(class)中)。如果你想实现一个可序列化的单例,你应该另外添加 readResolve() 方法,正如它描述的那样 here .


附言。
请记住,getInstance() 是类 Elvis 的静态方法,因此调用 e.getInstance()el .getInstance() 等于 Elvis.getInstance()

关于java - 在java中反序列化一个单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21361137/

相关文章:

JQuery 序列化表单 - Kendo UI 复制输入

java - 方法/打印随机数的直方图

java - 在Java Swing中绘制简单的条形图

java - 为什么会出现这个 "Could not open Hibernate Session for transaction"?

java - 无法捕获异常

Ruby 对象和 JSON 序列化(没有 Rails)

java - JSONVIEW.with 使用 @JsonFormat(shape = JsonFormat.Shape.OBJECT) 将枚举序列化为字符串

java - 无法从android接收php中的post参数?

C# 二进制序列化和 AssemblyFormat with FormatterAssemblyStyle.Full

python - 无法pickle Python 类实例