EAVE

序列化与readResolve()方法

readResolve办法是效果是什么?这个办法跟目标的序列化相关。 怎样跟目标的序列化相关了?

下面咱们先简要地回忆下目标的序列化。一般来说,一个类完成了 Serializable接口,咱们就可以把它往内存地写再从内存里读出而"拼装"成一个跟本来如出一辙的目标。不过当序列化遇到单例时,里面就有了个问题:从内存读出而拼装的目标破坏了单例的规矩。单例是要求一个JVM中只要一个类目标的,而现在经过反序列,一个新的目标克隆了出来。如下例所示:

Java代码:

public final class MySingleton implements Serializable { private MySingleton { } private static final MySingleton INSTANCE = new MySingleton; public static MySingleton getInstance { return INSTANCE; }}

当把 MySingleton目标序列化后再从内存中读出时,就有一个全新但跟本来相同的MySingleton目标存在了。那怎样来保护单例形式呢?这就要用到readResolve办法。 如下所示:

Java代码:

public final class MySingleton implements Serializable{ private MySingleton { } private static final MySingleton INSTANCE = new MySingleton; public static MySingleton getInstance { return INSTANCE; } private Object readResolve throws ObjectStreamException { // instead of the object we're on, // return the class variable INSTANCE return INSTANCE; }}



这样,当JVM从内存中反序列化地"拼装"一个新目标时,就会主动调用这个 readResolve办法来回来咱们指定好的目标了,单例规矩也就得到了确保。