设计模式之单例模式五(序列化与反序列化破坏)

单例模式的核心是要保证单例,但是在将一个实例序列化到一个文件中后,再反序列化得到一个实例,这两个实例是不同的,这就违反了单例原则,如下面恶汉式单例模式对序列化的测试:

由上面的打印信息可知得到的是两个不同的实例,通过调试跟代码可以很容易发现,在反序列化时通过反射newInstance了一个新的实例,我们可以通过下面方法防止这种序列化与反序列化的破坏:

上面的输出信息中可以看到现在已经是同一个对象了,只是在HungrySingleton中加了一个readResolve方法,在这个方法中返回了原来的实例,这个方法在反序列化时被反射调用,如果定义了这个方法,就返回这个方法的值,如果没有定义,则返回新new出来的对象。在调试打断点跟踪过程中很容易发现,由于是反射调用,里面的Method对象已经规定了调用时的方法名为readResolve,在这里我们才加这样名称的一个方法。

猜你喜欢

转载自blog.csdn.net/Wenlong_L/article/details/82810504