`
water84222
  • 浏览: 368516 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Sington类的序列化留存

 
阅读更多

Sington类的序列化

为了使Singleton类变成可序列化的(serializable),仅仅实现Serializable接口是不够的。为了维护 Singleton的单例性,你必须给Singleton类提供一个readResolve方法,否则的话,一个序列化的实例,每次反序列化的时候都会产 生一个新的实例。Singleton 也不会例外。

 

through the serializable tools, someone can write a singleton instance to disk, and then read it back up, effectively getting a new instance. Even though the constructor is private, the serializable tools have special access to create instances of a class regardless. Serialization has a special hook it uses - a private method on the class being instantiated calledreadResolve() - which is meant to supply a 'hook' for a class developer to ensure that they have a say in what object is returned by serialization. Oddly enough, readResolve() is not static, but is instead invoked on the new instance just created by the serialization. We'll get into that in a minute - for now, here is how our readResolve() method works with our singleton:

 

如下所示:

Java代码  收藏代码
  1. import java.io.FileInputStream;  
  2. import java.io.FileOutputStream;  
  3. import java.io.ObjectInputStream;  
  4. import java.io.ObjectOutputStream;  
  5. import java.io.ObjectStreamException;  
  6. import java.io.Serializable;  
  7.   
  8. //Singleton with final field  
  9. public class Singleton implements Serializable{  
  10.   
  11.     private static final long serialVersionUID = 5765648836796281035L;  
  12.     public static final Singleton uniqueInstance = new Singleton();  
  13.     private Singleton(){  
  14.     }  
  15.     //...Remainder omitted  
  16.     public static void main(String[] args) throws Exception{  
  17.         //序列化  
  18.          ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\Singleton.obj"));  
  19.          Singleton singleton = Singleton.uniqueInstance;           
  20.          objectOutputStream.writeObject(singleton);  
  21.          objectOutputStream.close();  
  22.          //反序列化  
  23.          ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\\Singleton.obj"));  
  24.          Singleton singleton2 = (Singleton)objectInputStream.readObject();  
  25.          objectInputStream.close();  
  26.          //比较是否原来的实例  
  27.          System.out.println(singleton==singleton2);  
  28.    }   
  29. }  

 输出结果为:false

解决方法是为Singleton类增加readResolve()方法:

Java代码  收藏代码
  1. //readResolve 方法维持了Singleton的单例属性  
  2.     private Object readResolve() throws ObjectStreamException{  
  3.         return uniqueInstance;  
  4.     }  

 再进行测试:输出结果为true

 

反序列化之后新创建的对象会先调用此方法,该方法返回的对象引用被返回,取代了新创建的对象。本质上,该方法忽略了新建对象,仍然返回类初始化时创建的那个实例。

 

分享到:
评论

相关推荐

    java-sington-factory-proxy 开发模式

    该资源包中分别使用单例,工厂,代理三种java开发模式,注释清晰,方便学习容易,,,通过小例子的演示让你轻松学会这三种开发模式!最重要的是物美价廉呢

    ThinkPHP3.2 集成 php-resque: PHP Resque Worker

    $is_sington = false; //是否单例运行,单例运行会在tmp目录下建立一个唯一的PID // 根据参数设置QUEUE环境变量 $QUEUE = in_array('--queue', $this->keys) ? $this->args['--queue'] : '*'; if (empty...

    华中科技大学电信专业 课程资料 作业 代码 实验报告-数据结构-内含源码和说明书.zip

    华中科技大学电信专业 课程资料 作业 代码 实验报告-数据结构-内含源码和说明书.zip

    java 游戏飞翔的小鸟

    java 制作游戏 飞翔的小鸟

    setuptools-25.3.0.zip

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    学生课设,C++数据结构实验,图的实现,vs2022完整项目,包含完整代码,开箱即用

    适用数据结构课程,大学生必备资源。 ALGraphAlgo.h 定义了图数据结构相关的函数,包括无向图的创建、获取顶点数据、邻接边及遍历操作。 ALGraphDef.h 定义了图的邻接列表数据结构,包括顶点、边的结构体和图的数据结构,以及队列结构。 pubuse.h 包含基本的标准库导入,定义了布尔常量、枚举和类型别名,用于项目中的通用操作。 ALGraphUse.cpp 实现了一个交互式应用,允许用户创建、探索并遍历图,使用了上述头文件中定义的数据结构和函数。 整个程序的功能是:提供一个基于命令行的图形数据结构交互式工具,用户可以创建无向图,查询顶点信息和邻接边,并进行深度优先和广度优先遍历。 这些文件整体上构成了一个C++实现的图数据结构库,包含图的定义、算法实现以及一个示例应用,让用户能够创建、操作和遍历无向图。

    JAVA+SQL离散数学题库管理系统(源代码+论文+外文翻译).zip

    JAVA+SQL离散数学题库管理系统是一个用Java编程语言和SQL数据库管理系统构建的应用程序,旨在帮助用户管理离散数学题库。该系统主要包括以下功能: 题库管理:允许用户添加、编辑、删除离散数学题目,包括题目内容、选项、答案等信息。用户可以根据需要对题目进行分类、标记或搜索。 用户管理:支持用户注册、登录、注销等功能,保障系统安全性和个性化服务。管理员可以管理用户权限,如分配不同的角色和权限。 练习和测试:用户可以通过系统进行练习和测试,选择特定题目或随机生成题目进行答题。系统会自动批改答案并记录用户的答题历史和成绩。 数据统计和分析:系统可以对用户的答题情况进行统计和分析,包括答题时间、正确率、题目难度等,帮助用户了解自己的学习情况并进行有效的学习计划。 系统设置:提供系统参数设置、题目难度调整、数据备份等功能,保障系统稳定运行和数据安全。 通过以上功能,JAVA+SQL离散数学题库管理系统能够有效地帮助用户管理离散数学学习过程中的题目资源,提高学习效率和成绩。

    毕业设计 基于Python+Django+itemCF和userCF算法音乐推荐系统源码+详细文档+全部数据资料 高分项目

    【资源说明】 毕业设计 基于Python+Django+itemCF和userCF算法音乐推荐系统源码+详细文档+全部数据资料 高分项目 【备注】 1、该项目是高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    setuptools-54.1.1-py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于Hadoop的决策树分类算法的并行化研究.docx

    概要:本研究基于Hadoop平台对决策树分类算法进行了并行化处理,旨在提高计算效率和扩展性。通过引入MapReduce编程模型,实现了在大规模数据集上的高效处理,显著提升了分类效率。 适用人群:本资源适用于数据科学家、机器学习工程师和对大数据处理有需求的专业人士。同时,也适合对并行算法和分布式计算感兴趣的学术研究者。 使用场景及目标:该资源可应用于大规模数据集上的决策树分类任务,如广告点击率预测、电子商务用户行为分析等领域。通过并行化处理,可以提高分类效率,加快模型训练速度,提升算法性能和准确度。 其他说明:本研究提供了基于Hadoop的决策树分类算法并行化处理的解决方案,适合于需要在大数据环境下进行机器学习任务的应用场景。通过利用分布式存储和计算框架,可以有效地处理大规模数据集,提高算法的实时性和准确性。欢迎对大数据处理和机器学习算法优化感兴趣的专业人士和研究者使用并参考该资源。

    setuptools-51.3.1-py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    setuptools-0.7.4.zip

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    GB-7714-2015 Zoetro的csl文件

    这是符合GB-7714-2015 Zoetro的csl文件,使用该标准的学校可以使用此csl撰写毕业论文,Zoetro的使用请查询其他博客,本人免费分享,若发现无法下载可以联系本人邮箱。

    setuptools-8.0.3.zip

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    华为OD机试D卷 - 小朋友来自多少小区 - 免费看解析和代码.html

    私信博主免费获取真题解析以及代码

    YOLOv8的Pyside6可视化界面

    PySide6:PySide6 是 Qt for Python 的官方绑定,提供了创建图形用户界面所需的所有工具和类。 YOLO 模型:选择一个 YOLO 版本(如 YOLOv3、YOLOv4 或 YOLOv5),并使用预训练的模型或自己训练的模型。 项目结构:设计应用程序的布局,包括菜单栏、工具栏、状态栏以及用于显示视频流和检测结果的窗口。 视频流处理:集成摄像头或视频文件,使用 YOLO 模型进行实时目标检测,并更新GUI以显示带有边界框的图像。 GUI 组件: 播放控制:开始、停止、暂停按钮。 参数调整:允许用户更改 YOLO 模型的参数,如置信度阈值、非极大值抑制(NMS)阈值等。 模型选择:如果支持多个模型,允许用户选择不同的 YOLO 模型。 线程处理:为了不阻塞 GUI,将视频处理和 YOLO 检测放在单独的线程中。 错误处理:确保应用程序能够处理各种潜在错误,如模型加载失败、视频流中断等。 用户文档:提供用户指南或文档,说明如何使用应用程序,包括如何配置和运行检测。 部署:使用 PyInstaller 或其他工具将应用程序打包,以便在没有 Python

    基于SpringBoot的“在线动漫信息平台”的设计与实现.rar

    随着社会互联网技术的快速发展,每个行业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于在线动漫信息平台当然也不能排除在外,随着网络技术的不断成熟,带动了在线动漫信息平台,它彻底改变了过去传统的管理方式,不仅使服务管理难度变低了,还提升了管理的灵活性。这种个性化的平台特别注重交互协调与管理的相互配合,激发了管理人员的创造性与主动性,对在线动漫信息平台而言非常有利。 本系统采用的数据库是Mysql,使用Spring Boot框架开发,Java语言、B/C架构。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。

    图王输入法自动切换-V1.0.3

    图王输入法自动切换, ACAD2010~2025命令永行远是英文状态, 免除输入命令时中文干扰

    母亲节快乐python14-条件判断结合比较运算符.ev4.rar

    母亲节快乐python14-条件判断结合比较运算符.ev4.rar

    setuptools-6.1.zip

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

Global site tag (gtag.js) - Google Analytics