这样做的目的是什么

来源:8-6 单例设计模式-序列化破坏单例模式原理解析及解决方案

海与千巷

2021-03-09

想请问老师
假如类中初始有一个成员变量int i = 10
在最初实例化单例对象后,修改i = 5,再序列化以后,其实存储的i是5,再通过反序列化回来,类中不写readResolve得到的结果是序列化文件中的i = 5,类中如果写了readResolve得到的内存中实例化的对象i也是5,这里没什么问题
但是如果在序列化以后,执行下面这段程序
图片描述
即直接从本地读取序列化文件时,类中不写readResolve得到的是序列化文件存储的i = 5,但是若类中写了readResolve那得到的i就为10了(因为HungrySingleton被重新加载初始化了)。
不知道我描述的清不清楚,就是说readResolve虽然解决了单例被破坏的问题,但是返回的数据其实和被序列化的数据是不同的,这样显然有问题;而且反序列化过程中必然会newInstance,所以保持返回最初的单例对象有啥用?所以加readResolve的用处是?

写回答

1回答

_X_X

2021-03-09

因为HungrySingleton被重新加载初始化了

----------

如果已存在这个实例,应该没有被重新初始化,因为序列化和反序列化之后的实例内存地址是一致的,说明一直都是同一个对象

0
1
海与千巷
你可能没看明白,朋友
2021-03-10
共1条回复

Java设计模式精讲-Debug方式+内存分析

系统学习设计原则,设计模式,锤炼编码内功,赢取高薪Offer

3430 学习 · 407 问题

查看课程