ToStringBuilder学习(三):readResolve()方法与序列化
在ToStringBuilder学习(一)中提到一个问题,即 readResolve方法是干啥的? 当时也没多想, 只是列在那里, 今天忙里偷闲地把搜点材料整理下这个问题.
原来这个方法跟对象的序列化相关(这样倒是解释了为什么 readResolve方法是private修饰的). ??? 怎么跟对象的序列化相关了?
下面我们先简要地回顾下对象的序列化. 一般来说, 一个类实现了 Serializable接口, 我们就可以把它往内存地写再从内存里读出而"组装"成一个跟原来一模一样的对象. 不过当序列化遇到单例时,这里边就有了个问题: 从内存读出而组装的对象破坏了单例的规则. 单例是要求一个JVM中只有一个类对象的, 而现在通过反序列化,一个新的对象克隆了出来.
如下例所示:
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方法来返回我们指定好的对象了, 单例规则也就得到了保证.
---------------------------------
上面用的例子来源于这个链接:http://www.javalobby.org/java/forums/t17491.html, 另这个链接中还有一个更为高级的例子, 如有兴趣可去一看.
博客元地址:http://rmn190.iteye.com/blog/350193
转载于:https://www.cnblogs.com/kabi/p/5182837.html
ToStringBuilder学习(三):readResolve()方法与序列化相关推荐
- ReadResolve方法与序列化
使用枚举实现的单例模式,不但可以防止利用反射强行构建单例对象,而且可以在枚举类对象被反序列化的时候,保证反序列的返回结果是同一对象. 对于其他方式实现的单例模式,如果既想要做到可序列化,又想要反序列化 ...
- Opencv3编程入门学习笔记(三)之访问图像像素的三种方法
访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...
- (转)MyBatis框架的学习(三)——Dao层开发方法
http://blog.csdn.net/yerenyuan_pku/article/details/71700957 使用MyBatis开发Dao层,通常有两个方法,即原始Dao开发方法和Mappe ...
- 21天学习之二(Android 10.0 SystemUI默认去掉底部导航栏的三种方法)
活动地址:CSDN21天学习挑战赛 1.概述 在定制化开发中,在SystemUI的一些定制功能中,针对默认去掉底部导航栏的方法有好几种,StatusBar和DisplayPolicy.java中api ...
- java数据输入的步骤_Java学习日志1.4 Scanner 数据输入的三种方法
Scanner sc = new Scanner(System.in); /注意in 是InputStream的缩写,是字节输入流的意思. 整句话的含义就是: new 一个对象,接受从键盘输入的数据, ...
- python学习音频-详解python播放音频的三种方法
第一种 使用pygame模块 pygame.mixer.init() pygame.mixer.music.load(self.wav_file) pygame.mixer.music.set_vol ...
- python描述符魔术方法_学习笔记-Python基础9-面向对象编程OOP-类的成员描述符(property)、类的常用内置属性、类的常用魔术方法、类和对象的三种方法...
一.类的成员描述符(property) 类的成员描述符是为了在类中,对类的成员属性进行相关操作而创建的一种方式,大部分属于数据清洗 属性有三种操作:get获取属性值.set修改或添加属性.delete ...
- EIGRP区域注入静态路由的三种方法--CCNP学习笔记
EIGRP区域注入静态路由的三种方法 拓扑图 R2为外网,R1为边界路由器.R3,R4为内部路由器 基本配置 R2配置: R2#sh run Building configuration... Cur ...
- php+数组存放文件名_php将数组存储为文本文件的三种方法
本篇文章主要介绍php将数组存储为文本文件的三种方法,感兴趣的朋友参考下,希望对大家有所帮助. (1)利用serialize 将数组序列化存储为文本文件,调用时候再使用unserialize 还原&l ...
最新文章
- LTE - PRACH 时频资源介绍
- CentOS虚拟机和物理机共享文件夹实现
- shell python优势_python的优势
- AngularJs学习笔记--expression
- 网络工程师成长日记417-西安如家酒店无线覆盖技术支持
- html5+、ReactNative、Weex、Ionic之间的区别、(配置java、python、Android环境)、ReactNative(react-native-cli)、yarn、Weex
- 新电脑怎么分盘_【磁盘分区教程】如何给电脑进行分区?
- [server]阿里云服务器远程文件传输的解决方案
- 《Pro SQL Server Internals, 2nd edition》的CHAPTER 2 Tables and Indexes中的Clustered Indexes一节...
- c语言计算燃烧温度,f与c温度换算(温度f和c换算计算器)
- 图像直方图及其均衡化--opencv
- FFmpeg —— 14.示例程序(八):音频编码器(PCM编码为AAC)
- 38岁超任模拟器设计者自杀!死前留下真名与神秘自拍照,最后一刻开源higan
- 【练习/Python】监测汇率脚本
- 优漫动游平面设计思维思维训练法
- 【项目管理】项目进度管理
- Android Studio使用真机(连接安卓手机驱动)调试教程
- 365技术网址导航源码附加交易系统
- unity 调用大华设备视频
- 基于JAVA电影院售票系统设计与实现 开题报告
热门文章
- 为什么 wait/notify/notifyAll 在 Object 类定义而不是 Thread 类?
- 9个用于构建容错系统的开源工具
- 北大 AI 公开课 2019 | 颜水成:人工智能行业观察与实践
- centos(linux) 下如何查看端口占用情况及杀死进程
- 川大优秀毕业生在GitHub上建了一个项目《深度学习500问》,还未完结就获赞无数
- java ReentrantLock 实现原理
- 网络:TCP停止等待、超时重传、滑动窗口、拥塞控制、快重传和快恢复
- 多线程:并发实现方法之J.U.C
- 如何发布php网站_php网站如何发布【货币问答】- 联合货币
- 路由表及路由的选择算法