对象序列化单例

来源:互联网 发布:管理权限的软件 编辑:程序博客网 时间:2024/06/05 01:12

在序列化和反序列化时,如果要保证对象是唯一的(例如单例模式),需要加倍小心,通常会在实现单例和类型安全的枚举是发生。在此情况下,默认的序列化机制不适用。

public final class Singelton implements Serializable {

private Singelton() {

}

private static final Singelton INSTANCE = new Singelton();

public static Singelton getInstance() {

return INSTANCE;

}

}

如果将单例对象序列化,再从内存中反序列化该对象

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("test.dat"));
out.writeObject(single1);

ObjectInputStream in = new ObjectInputStream(new FileInputStream("test.dat"));

Singelton newsingle = (Singelton) in.readObject();

此时的newsingle与single1强完全不同,是一个全新的对象,破坏了单例原则。

为了解决这个问题,需要在类中添加一个特殊的序列化方法readResolve()方法。如果定义了该方法,则在对象被序列化之后就调用它。

public final class Singelton implements Serializable {

private Singelton() {

}

private static final Singelton INSTANCE = new Singelton();

public static Singelton getInstance() {

return INSTANCE;

}

private Object readResolve() throws ObjectStreamException { 

return INSTANCE;  

  }  

}

1 0