java 中序列化与readResolve()方法的实例详解

网友投稿 330 2023-04-23


java 中序列化与readResolve()方法的实例详解

java 中序列化与readResolve()方法的实例详解

readResolve方法是作用是什么?这个方法跟对象的序列化相关(这样倒是解释了为什么 readResolve方法是private修饰的)。 怎么跟对象的序列化相关了?

下面我们先简要地回顾下对象的序列化。一般来说,一个类实现了 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对象(通过getInstance方法获得的那个单例对象)序列化后再从内存中读出时,就有一个全新但跟原来一样的MySingleton对象存在了。那怎么来维护单例模式呢?这就要用到readResolve方法。 如下所示:

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方法来返回我们指定好的对象了,单例规则也就得到了保证。

以上就是java 中序列化与readResolve()方法的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:开源企业级api网关(企业级开源nas)
下一篇:mock up 工具(mock up sample)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~