我发现很多线程在stackoverflow.com中运行,以使SingleTon对象可序列化。
专家们也提供了序列化Singleton对象的方法。
在我看来,即使我们实现了Serializable接口,我们也无法序列化单例对象,因为SingleTon引用变量在同一个类中是静态的。
而Serialization api表示我们无法在文件中序列化或编写静态引用的状态
而且我们也无法保存瞬态变量的状态
虽然忽略了序列化过程(实际写入过程)静态和瞬态变量
如果我误解了,请提供宝贵的意见。如果我误解了,有人可以帮助用代码示例序列化Singleton对象吗?
答案 0 :(得分:2)
我认为你正在混淆实现单例的方式以及对象的序列化方式。
虽然经常用于实现单例的静态字段确实不会被序列化为序列化实例的一部分,但实例本身肯定可以序列化。您需要做的就是将其反序列化版本设置回静态字段,您需要在代码中手动完成。
P.S。请注意,我并不是说序列化(甚至实现)单例一定是个好主意,我只想说它可以完成。
答案 1 :(得分:1)
是的,静态引用不是seralized。这并不意味着您无法获取静态引用(单例实例)的值并选择序列化它。
答案 2 :(得分:1)
单身人士可以被序列化,以下是如何做的代码:
import java.io.Serializable;
public class MySingleton implements Serializable {
private MySingleton(String name) {
this.name = name;
}
private static MySingleton mySingleton;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static MySingleton getInstance(String name) {
if(mySingleton == null) {
System.out.println("in if...");
mySingleton = new MySingleton(name);
}
return mySingleton;
}
}
这里是“main”方法,它获取上面的Singleton类的实例,序列化和反序列化它:
public static void main (String[] args) {
MySingleton m = MySingleton.getInstance("Akshay");
try {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D://temp.ser"));
oos.writeObject(m);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D://temp.ser"));
MySingleton m2 = (MySingleton) ois.readObject();
System.out.println(m2.getName());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
输出为: -
in if ...
阿克沙伊
感谢。