`

序列化与单例

阅读更多
当单例模式的类实现了系列化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的乒乓狂魔
分享到:
评论

相关推荐

    winform序列化 md5加密 单例模式(无视频).rar

    在C#编程中,"winform序列化 md5加密 单例模式(无视频).rar"这个压缩包文件涵盖了一些核心的编程概念和技术,包括Windows Forms(WinForms)应用程序开发、对象序列化、MD5加密以及单例模式。让我们一一探讨这些知识...

    Java单例模式设计

    本篇文章将深入探讨Java中的三种单例实现方式:饿汉单例、懒汉单例以及序列化与反序列化对单例的影响。 **1. 饿汉单例模式** 饿汉单例在类加载时就完成了初始化,因此是线程安全的。它的实现方式通常使用静态常量...

    枚举类实现单例,并且解决序列化给前端展示的问题.zip

    本源码由 springboot 开发,只有2个简单的文件(1是 枚举类单例,2是 controller请求测试类)。 主要测试了枚举类的饿汉式加载机制 / 单例机制。 代码中包含枚举类的基本使用,和完整的请求示例。 主要实现了枚举类...

    Java面试要点(适用于2年以上经验,1年亦可)

    3. 序列化与单例模式 4. protobuf 5. 序列化并不安全 注解 1. 元注解、自定义注解、Java 中常用注解使用 2. 注解与反射的结合 JMS 1. 什么是 Java 消息服务、JMS 消息传送模型 JMX 1. java.lang.management.*...

    序列化类的作用Serializable

    `readResolve()`则是在反序列化时用来替换读取的对象,通常用于处理类版本控制或者单例模式。 为了确保序列化和反序列化的兼容性,Java引入了一个名为`serialVersionUID`的版本号。这是一个长期(long)类型的静态...

    用序列化(Serializable)保存、读取对象

    - **流式序列化与数据结构序列化**: 流式序列化是Java的标准序列化方式,而数据结构序列化(如JSON、XML)更注重数据的可读性和互操作性。 - **序列化安全**: 序列化可以暴露敏感信息,因此需要注意安全问题,如避免...

    hessian序列化.pdf

    SerializerFactory中有两个静态map,_staticSerializerMap和_staticDeserializerMap,用来存放类与序列化和反序列化工具类的映射。这样,如果已经用过的序列化工具就可以直接拿出来用,不必再重新实例化工具类。 ...

    设计模式——单例实现

    单例的5中实现及反射和反序列化破解单例。

    Java 序列化的秘密(高清PDF中文版)

    3. **兼容性**:确保序列化格式与目标平台兼容。 4. **版本控制**:当类结构发生变化时,需要妥善处理序列化兼容性问题。 5. **资源管理**:合理管理序列化过程中使用的资源,避免资源泄露。 #### 附录1: `...

    单例模式的反射漏洞和反序列化漏洞代码实例

    单例模式的反射漏洞和反序列化漏洞代码实例 单例模式是软件设计模式中一种常用的设计模式,用于限制一个类的实例化次数,确保一个类在整个应用程序中只有一个实例。然而,单例模式存在一些漏洞,例如反射漏洞和反...

    Java 序列化的高级认识1

    如果需要在序列化过程中包含静态变量,必须采取特殊措施,但这通常是不推荐的,因为它可能破坏单例模式或其他依赖于静态状态的设计。 **对敏感字段加密**: 在序列化过程中,有时需要保护某些敏感信息。例如,如果...

    单例模式详解 1. 什么是单例模式? 1.1 单例模式的核心要素 1.2 为什么需要单例模式? 2. 单例模式的实现方式 2.1 饿汉式(静态常量) 2.2 饿汉式(静态代码块) 2.3 懒汉式(线程

    5.2 序列化问题 5.3 反射攻击 6. 单例模式与其他模式的关系 6.1 单例与工厂模式 6.2 单例与策略模式 7. 单例模式的测试 7.1 验证唯一性 7.2 测试多线程环境 8. 实用单例模式的最佳实践 8.1 何时使用单例 8.2 如何...

    7种单例模式

    下面将详细介绍七种常见的单例模式实现方式,并结合多线程环境和反序列化测试进行讨论。 1. **饿汉式单例**: 这是最简单的单例实现,它在类加载时就创建了实例,因此是线程安全的。 ```java public class ...

    Java的单例设计模式

    4. 避免序列化破坏单例:如果单例实现了`Serializable`接口,序列化和反序列化可能导致多个实例。为此,可以在单例类中添加`readResolve()`方法来返回唯一的实例。 总的来说,Java的单例设计模式是一种强大的工具,...

    单例模式,single

    - **序列化的影响**:如果单例类实现了 `Serializable` 接口,那么通过序列化和反序列化可能会产生新的实例,这同样会破坏单例模式。 针对上述问题,可以采取以下几种策略: 1. **线程安全的单例模式**:可以通过...

    Java对象(最后面是序列化的知识)1

    在序列化中,如果不处理,反序列化可能会破坏单例,因为每次反序列化都会创建新的对象。为了避免这种情况,可以在类中添加`readResolve()`方法,返回单例的实例。 为了保证不同版本的序列化数据兼容,可以指定`...

    实验12 单例模式与枚举.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    单例模式与双重检测

    除了上述的单例模式实现,Java中还提供了`Enum`方式来创建单例,这种方式不仅简单且线程安全,同时也避免了反射和序列化攻击。例如: ```java public enum Singleton { INSTANCE; } ``` 通过枚举方式实现单例,...

Global site tag (gtag.js) - Google Analytics