对象序列化单例

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

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;  

  }  

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值