Java中序列化和readResolve()方法的使用详解
程序员文章站
2022-03-31 17:29:50
...
这篇文章主要介绍了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()方法的使用详解的详细内容,更多请关注其它相关文章!
上一篇: struts2中的参数传递的详细介绍
下一篇: php数组相关函数的使用_PHP教程
推荐阅读
-
详解Linux系统中ls和dir命令的组合使用
-
js中el表达式的使用和非空判断方法
-
MySQL中datetime和timestamp的区别及使用详解
-
解析iOS应用的UI开发中懒加载和xib的简单使用方法
-
java中为什么接口中的属性和方法都默认为public?
-
详解Python中的__new__()方法的使用
-
JavaSacript中charCodeAt()方法的使用详解
-
JavaScript中toString()方法的使用详解
-
详解Node.js中path模块的resolve()和join()方法的区别
-
浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别