当单例模式的类实现了系列化Serializable接口,也可以通过反序列化来使它不再单例。
我们的单例类:
public final class Singleton implements Serializable{
private static final long serialVersionUID = 1735776740157142434L;
private static final Singleton instance=new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
序列化和反序列化如下:
Singleton singleton1=Singleton.getInstance();
FileOutputStream fileOut=new FileOutputStream("D:\\singleton.txt");
ObjectOutputStream out=new ObjectOutputStream(fileOut);
out.writeObject(singleton1);
out.close();
FileInputStream fileInputStream=new FileInputStream("D:\\singleton.txt");
ObjectInputStream in=new ObjectInputStream(fileInputStream);
Singleton singleton2=(Singleton)in.readObject();
in.close();
System.out.println(singleton1);
System.out.println(singleton2);
System.out.println(singleton1==singleton2);
先将singleton1序列化到一个文件中,然后再从该文件中读取出singleton2,结果如下:
com.lg.design.singleton.hungry.Singleton@173e55db
com.lg.design.singleton.hungry.Singleton@4690d3c6
false
可以看到Singleton不能保证是一个单例类。但是解决方法(不能解决所有情况)为我们认为的干预序列化,使之返回我们自定义的对象,这就需要在Singleton 中添加一个readResolve方法,如下:
public final class Singleton implements Serializable{
private static final long serialVersionUID = 1735776740157142434L;
private static final Singleton instance=new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
private Object readResolve(){
return instance;
}
}
此时再次执行,singleton1和singleton2便是同一个对象了,如下:
com.lg.design.singleton.hungry.Singleton@35427e6e
com.lg.design.singleton.hungry.Singleton@35427e6e
true
有关序列化的具体详细内容,请见后续文章。
若想转载请注明出处: http://lgbolgger.iteye.com/blog/2160592
作者:iteye的乒乓狂魔
分享到:
相关推荐
序列化 md5加密 单例模式(无视频).rar
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
1、掌握单例模式的应用场景。 2、掌握 IDEA 环境下的多线程调试方式。 3、掌握保证线程安全的单例模式策略。 4、掌握反射暴力攻击单例解决方案...5、序列化破坏单例的原理及解决方案。 6、掌握常见的单例模式写法。
单例的5中实现及反射和反序列化破解单例。
代码中演示了Java设计模式中的单例模式,其中包括饿汉单例模式,懒汉单例模式以及序列化饭序列化单例模式。在实际的开发中,可以直接借鉴使用。
本源码由 springboot 开发,只有2个简单的文件(1是 枚举类单例,2是 controller请求测试类)。 主要测试了枚举类的饿汉式加载机制 / 单例机制。 代码中包含枚举类的基本使用,和完整的请求示例。 主要实现了枚举类...
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。
设计模式之七种单例模式代码及ppt,包含多线程环境测试和反序列化测试
在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化(serialization)时如何处理这些缺陷。 单例模式适合于一个类只有一个实例的情况,比如窗口管理器...
单例模式的在调用的时候生成对象(使用内部类) 以及对应的防止序列化导致的不相同
android 六种单例模式源码介绍,反序列化解决方案,编译环境为android studio 3.0.1
单例模式是最简单的设计模式之一,但是对于Java的开发者来说...在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化(serialization)时如何处理这些缺陷。
单例模式的总体概述 单例模式,属于创建型模式,《设计模式》一书对它做了定义:保证一个类仅有一个实例,并提供一个全局访问点...防止序列化破坏单例模式 多种实现方式与比较 线程安全的饿汉模式 public class HungryS
主要介绍了单例模式的反射漏洞和反序列化漏洞,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
入名所示,该文件为最详细的Java单例模式讲解并附有讲解代码。主要讲了单例模式的几种方法,懒汉...饿汉模式和静态内部类模式如何设置能够避免使用反射方法获取多个实列,以及实现了序列化的类如何避免创建多个实列。
java 单例和反射反射会破坏序列化* 测试反射//为 true, 禁止java语言进行访问检查* 双重检查public class Singleton5 im
目录单例模式懒汉式单例模式未初始化问题解决Double Check 双重检查方案一:不让第二步和第三步重排序-DoubleCheck方案二:基于类初始化-静态内部类饿汉式饿汉式与懒汉式最大区别序列化破坏单例模式原理枚举单例基于...
1.模式定义/应用场景/类图分析 2.字节码知识/字节码指令重排序 3.类加载机制 4.JVM序列化机制 5.单例模式在Spring框架 & JDK源码中的应用
XStream使用例子,如何序列化、反序列化到XML和JSON格式。
作为一种设计模式,单例模式,可以说的设计模式中比较难的。主要涉及到饿汉模式,懒汉模式,线程安全问题,反射攻击,序列化破坏等。