gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:45:02 25 4
gpt4 key购买 nike

我正在学习 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com