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