`
water84222
  • 浏览: 368157 次
  • 性别: 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...

    Linux 平台基于 Qt5 的网速浮窗.zip

    Linux 平台基于 Qt5 的网速浮窗

    手机游戏峡谷沼泽农田关卡地图Ai+EPS+PSD源文件.zip

    游戏开发资源,游戏UI,游戏GUI,游戏图标,PSD格式,XD格式,PNG下载,源文件,可编辑下载,游戏购物充值界面,宝石,图标,PS格式,AI格式等,游戏APP

    上市公司-企业资本结构动态调整数据及代码(2001-2022年).txt

    数据存放网盘,txt文件内包含下载链接及提取码,永久有效。 样例数据及详细介绍参见文章:https://blog.csdn.net/li514006030/article/details/138324717

    Git 常用命令手册大全

    Git 是一个开源的分布式版本控制系统,它允许你跟踪代码的更改,并且可以与他人合作开发项目。附件中是一些常用的 Git 命令。 这些命令覆盖了 Git 的基本操作,包括初始化、克隆、提交、分支管理、合并、查看状态和历史、远程仓库操作等。根据你的具体需求,可能还需要学习更多的命令和 Git 的高级用法。 文件绿色安全,仅供学习交流使用,欢迎大家下载学习交流!

    中科大2021秋《机器学习概论》课程资源.zip

    机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。它专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。机器学习是人工智能的核心,是使计算机具有智能的根本途径。 机器学习的发展历程可以追溯到20世纪50年代,当时Arthur Samuel在IBM开发了第一个自我学习程序,一个西洋棋程序,这标志着机器学习的起步。随后,Frank Rosenblatt发明了第一个人工神经网络模型——感知机。在接下来的几十年里,机器学习领域取得了许多重要的进展,包括最近邻算法、决策树、随机森林、深度学习等算法和技术的发展。 机器学习有着广泛的应用场景,如自然语言处理、物体识别和智能驾驶、市场营销和个性化推荐等。通过分析大量的数据,机器学习可以帮助我们更好地理解和解决各种复杂的问题。例如,在自然语言处理领域,机器学习技术可以实现机器翻译、语音识别、文本分类和情感分析等功能;在物体识别和智能驾驶领域,机器学习可以通过训练模型来识别图像和视频中的物体,并实现智能驾驶等功能;在市场营销领域,机器学习可以帮助企业

    游戏道具3D立体blender模型图标素材-3d Game Asset Icon Vol.1.zip

    游戏开发资源,游戏UI,游戏GUI,游戏图标,PSD格式,XD格式,PNG下载,源文件,可编辑下载,游戏购物充值界面,宝石,图标,PS格式,AI格式等,游戏APP

    K1213-Q版游戏UI界面.zip

    游戏开发资源,游戏UI,游戏GUI,游戏图标,PSD格式,XD格式,PNG下载,源文件,可编辑下载,游戏购物充值界面,宝石,图标,PS格式,AI格式等,游戏APP

    百问网linux桌面GUI,基于LVGL 8.x。.zip

    百问网linux桌面GUI,基于LVGL 8.x。

    HTML5小游戏源码下载网页版游戏JS小游戏-塔防源码.zip

    HTML5小游戏源码下载,JS小游戏源码下载,坦克大战,驴子跳,连连看,俄罗斯方块,圈泡泡,塔防,太空战舰,愤怒的小鸟,植物大战僵尸,水果忍者,扫雷,超级玛丽,打地鼠,坦克大战,麻将等JS小游戏源码下载,游戏开发教程,网页游戏,本地直接打开就可以玩。

    2022年 【30页】外部环境边际改善,AIGC搭建元宇宙内容生态.zip

    2022年 【30页】外部环境边际改善,AIGC搭建元宇宙内容生态.zip

    node-v10.15.3-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v6.11.1-sunos-x64.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Support 客户关系管理 - SAS 支持.pdf

    Support 客户关系管理 - SAS 支持.pdf

    node-v6.12.1-sunos-x64.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    机械设计PF-1315反击式破碎机sw14可编辑非常好的设计图纸100%好用.zip

    机械设计PF-1315反击式破碎机sw14可编辑非常好的设计图纸100%好用.zip

    ATMEGA328P+CH340C arduino-nano最小系统开发板AD09设计硬件(原理图+PCB)文件.zip

    ATMEGA328P+CH340C arduino_nano最小系统板ALTIUM设计硬件原理图+PCB文件,硬件采用2层板设计,大小为8x10mm, 包括完整的ALTIUM设计硬件原理图和PCB文件,可以做为你的设计参考。

    源代码-160.es免费资源网程序.zip

    源代码-160.es免费资源网程序.zip

    用Python来抓取一个新闻网站上的文章标题、链接、发布时间和内容

    在这个爬虫开发案例中,我们将使用Python的requests库和BeautifulSoup库来抓取一个新闻网站(如https://news.example.com)上的文章标题、链接、发布时间和内容。 代码解释 导入requests和BeautifulSoup库。 定义get_article_list函数,接收一个URL参数,用于获取文章列表。 使用requests.get()方法发送GET请求,获取网页内容。 使用BeautifulSoup解析网页内容,提取文章标题、链接和发布时间。 将提取到的文章信息存储在一个字典列表中,并返回。 定义get_article_content函数,接收一个URL参数,用于获取文章内容。 使用requests.get()方法发送GET请求,获取网页内容。 使用BeautifulSoup解析网页内容,提取文章内容。 返回提取到的文章内容。 在主函数main中调用get_article_list函数,遍历文章列表并输出标题、链接、发布时间和内容。 注意:请将示例中的https://news.example.com替换为您要抓取的实际新闻网站URL。在

Global site tag (gtag.js) - Google Analytics