前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >防止Java序列化/反射破坏单例模式的解决方案

防止Java序列化/反射破坏单例模式的解决方案

作者头像
JavaEdge
发布2021-02-22 14:26:38
7130
发布2021-02-22 14:26:38
举报
文章被收录于专栏:JavaEdge

1 案例

  • 熟悉的 DCL 单例实现
  • 测试类

可见对Singleton的序列化、反序列化得到的对象是一个新的对象,说明破坏了Singleton的单例性。

2 序列化破坏单例的源码分析

看关键代码readOrdinaryObject

  • 该处创建的obj就是本方法要返回的对象
  • isInstantiable:若一个serializable/externalizable的类可在运行时被实例化,则该方法返回true
  • desc.newInstance:该方法通过反射调用无参构造器生成一个对象

所以在序列化的底层是会通过反射调用无参构造器创建一个新的对象的。

3 避免序列化破坏单例

3.1 ObjectInputStream#readObject

  • hasReadResolveMethod:若实现了serializable/externalizable接口的类中包含readResolve,则返回true
  • invokeReadResolve:通过反射调用要被反序列化的类的readResolve方法

3.2 解决方案

在Singleton类中定义readResolve即可:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 案例
  • 2 序列化破坏单例的源码分析
  • 3 避免序列化破坏单例
    • 3.1 ObjectInputStream#readObject
      • 3.2 解决方案
      相关产品与服务
      文件存储
      文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档