public class ThreadSafeSingleton implements Serializable {
@Override
public String toString() {
return "ThreadSafeSingleton [i=" + i + ", str=" + str + "]";
}
int i;
String str;
private static ThreadSafeSingleton instance;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
private ThreadSafeSingleton(){
}
public static synchronized ThreadSafeSingleton getInstance(int i,String str){
if(instance == null){
synchronized (ThreadSafeSingleton.class) {
if(instance == null){
instance = new ThreadSafeSingleton();
}
}
}
instance.setI(i);
instance.setStr(str);
return instance;
}
public Object readResolve(){
System.out.println("readResolve executed");
return getInstance(this.i,this.str);
}
public static void main(String[] args) throws IOException, Exception {
FileOutputStream fos = new FileOutputStream(
"B://Serilization//text1.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
ThreadSafeSingleton obj = new ThreadSafeSingleton();
obj.setI(1);
obj.setStr("katrina kaif");
oos.writeObject(obj);
System.out.println("serilization done");
FileInputStream fis = new FileInputStream("B://Serilization//text1.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
ThreadSafeSingleton copy=(ThreadSafeSingleton) ois.readObject();
System.out.println("copy "+copy);
System.out.println("deserilization done");
}
}
在上面的代码中,我有一个包含int i和String str属性的单例类,我已经实现了Serializable接口,我的要求是,当我序列化一个类时,我将在一个JVM上使用一些属性值序列化该类,并且当我反序列化时在另一个JVM上,我应该获得我的单例类的相同实例,但是类中的属性应该使用我在序列化期间提供的值进行更新
这里在互联网上我检查了解决方案我必须使用readResolve方法,你可以编写一个逻辑,它将设置我在单例类序列化过程中提供的属性值,所以如果你看到readResolve的代码,我已写了一个像这样的代码"返回getInstance(this.i,this.str);" 这里我使用了"这个" 关键字这意味着当前的对象正在被使用,因此我有疑问 我怀疑这个代码在这里创建新对象为"这个" 是指除了我在getInstance(int i,String str)方法中创建的对象之外的当前对象可以任何人请解释这是破坏单身人士?
答案 0 :(得分:0)
您可能需要阅读Java serialization: readObject() vs. readResolve()。调用readResolve()
时,您的对象已从流中反序列化并完全创建。在这种情况下,您的this
指针将是反序列化过程构造的对象,并且包含流中的i
和str
值。如果您使用this.i
和this.str
构建新的Singleton,则不会使用新的JVM特定参数创建新对象。