2023-02-22
原文作者:键盘林 原文地址:https://blog.csdn.net/qq_37909508/category_8976362.html

通过序列号来破坏单例模式

饿汉式为例

实现序列号接口

202302222100589461.png

我们可以看到我们通过序列化的方式创建出来了两个不同的对象,导致破坏了原本的单例模式

202302222101001242.png

解决办法,在HungrySingleton类中创建一个方法

202302222101036643.png

在运行一下

202302222101055484.png

我们可以知道这个方法肯定是重载方法

我们可以进入到ObjectInputStream这个类来查看

202302222101075005.png

202302222101098146.png

202302222101132247.png

202302222101155028.png

202302222101174669.png

2023022221012273110.png

2023022221012640611.png

当类被序列号和反序列化时候返回true

2023022221012962512.png

因此当前返回回来就会new一个instance

2023022221013167813.png

因此我们知道了序列号和反序列化返回的是一个新的对象

2023022221013465714.png

判断是否存在ReadResolve()方法

2023022221013723215.png

2023022221013922716.png

很明显该方法调用了我们写的readResolveMethod方法

2023022221014118017.png

上面调用的也就是下面这个方法

2023022221014374618.png

回到原来所以req拿到的是单例下的对象,虽然我们在看源码的时候发现,它内部有instance了一个对象,但是并没有返回,对于我们来说没啥用^_^

2023022221014551219.png

阅读全文