最近观看effective in java ,提到单例模式创建过程中,如果是要保证该对象是可序列化的,需要考虑两点:

1、继承Serializable接口

2、增加readResolve方法

比较疑惑的是为什么需要增加这个方法,在以往的使用中需要被序列化的场景也不多,但是自己确实不明白这个单例对象在反序列化的时候会导致增加一个假冒的对象,从而’单例变的也不在单例‘

深入到代码细节观察发现:

ObjectInputStream反序列化会利用ObjectStreamClass序列化描述符创建一个实例

1、如果实例不为空

2、且描述符内检测到含有readResolve方法

3、反序列化中没有异常发生

满足以上条件会反射执行readResolve获取实例对象,并且和先前的对象作比较,不相等,用本次的值覆盖先前的返回值

不满足以上条件直接返回实例对象,完成反序列化

ObjectInputStream源码如下(标红部分):

private Object readOrdinaryObject(boolean unshared)

throws IOException

{

if (bin.readByte() != TC_OBJECT) {

throw new InternalError();

}

ObjectStreamClass desc = readClassDesc(false);

desc.checkDeserialize();

Object obj;

try {

obj = desc.isInstantiable() ? desc.newInstance() : null;

} catch (Exception ex) {

throw (IOException) new InvalidClassException(

desc.forClass().getName(),

"unable to create instance").initCause(ex);

}

passHandle = handles.assign(unshared ? unsharedMarker : obj);

ClassNotFoundException resolveEx = desc.getResolveException();

if (resolveEx != null) {

handles.markException(passHandle, resolveEx);

}

if (desc.isExternalizable()) {

readExternalData((Externalizable) obj, desc);

} else {

readSerialData(obj, desc);

}

handles.finish(passHandle);

if (obj != null &&

handles.lookupException(passHandle) == null &&

desc.hasReadResolveMethod())

{

Object rep = desc.invokeReadResolve(obj);

if (unshared && rep.getClass().isArray()) {

rep = cloneArray(rep);

}

if (rep != obj) {

handles.setObject(passHandle, obj = rep);

}

}

return obj;

}

-----------------------------------------------------------------------------------------------------------------------

测试程序如下:

package com.tt.st;

import java.io.ObjectStreamException;

import java.io.Serializable;

public class Singleton implements Serializable {

/**

*

*/

private static final long serialVersionUID = 2090309963475550553L;

private static final Singleton instance = new Singleton();

private Singleton() {

System.out.println(System.currentTimeMillis());

}

public static Singleton getInstance() {

return instance;

}

private Object readResolve()  throws ObjectStreamException {

return instance;

}

}

package com.tt.st;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

public class Main {

private static native ClassLoader latestUserDefinedLoader();

public static void main(String[] args) throws Exception{

// TODO Auto-generated method stub

File file = new File("d:\\doc\\ab.out");

ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));

Singleton singleton = Singleton.getInstance();

System.out.println("first: " + singleton);

objectOutputStream.writeObject(singleton);

objectOutputStream.close();

ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));

Object object = objectInputStream.readObject();

System.out.println("second: " + object);

objectInputStream.close();

}

}

python反序列化总结_单例模式的反序列化总结相关推荐

  1. csv反序列化_对象的反序列化

    用python实现接口测试(八.实现序列化与反序列化) 前言 在python中,序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式字符串解码为py ...

  2. 【反序列化漏洞-02】PHP反序列化漏洞实验详解

    为什么要序列化 百度百科上关于序列化的定义是,将对象的状态信息转换为可以存储或传输的形式(字符串)的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区(非关系型键值对形式的数据库Redis, ...

  3. python老师武_跟着廖雪峰老师学python (5)

    若想技术精进,当然得把基础知识打得牢牢的. 廖雪峰的官方网站  python3教程,该网站提供的教程浅显易懂,还附带了讲学视频,非常适合初学者正规入门. 以下是通过廖雪峰python官方网站学习的个人 ...

  4. 计算机编程导论python程序设计答案-学堂在线_计算机科学与Python编程导论_作业课后答案...

    学堂在线_计算机科学与Python编程导论_作业课后答案 答案: 更多相关问题 近代中国完全沦为半殖民地半封建社会的标志是:A.<马关条约>B.<辛丑条约>C.<凡尔赛和 ...

  5. python 爬虫源代码-从零开始学Python网络爬虫_源代码.rar

    [实例简介] [实例截图] [核心代码] 从零开始学Python网络爬虫_源代码_1 ├── 58project │ ├── __pycache__ │ │ ├── channel_extract.c ...

  6. python编程基础_月隐学python第2课

    python编程基础_月隐学python第2课 学习目标 掌握变量的输入和输出 掌握数据类型的基本概念 掌握算数运算 1.变量的输入和输出 1.1 变量输入 使用input输入 input用于输入数据 ...

  7. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  8. python机器学习预测_使用Python和机器学习预测未来的股市趋势

    python机器学习预测 Note from Towards Data Science's editors: While we allow independent authors to publish ...

  9. 反序列化 php R类型,pikachu-PHP反序列化、XXE、SSFR

    一.PHP反序列化 1.1概述 在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数. 序列化serialize() 序列化说通俗点就是把一个对象变成可 ...

最新文章

  1. Metasploit makerc命令技巧
  2. hilb--生成Hilbert(希尔伯特)矩阵
  3. .Net版行号消除器
  4. KVM虚拟化实战精讲[第五章 利用virsh对虚拟机管理]
  5. mysql主键用完了怎么办_MySQL 自增 ID 用完了怎么办?
  6. leetcode 395. 至少有 K 个重复字符的最长子串(滑动窗口)
  7. pheatmap, gplots heatmap.2和ggplot2 geom_tile实现数据聚类和热图plot
  8. 想起了那个充满忧伤的夏天
  9. python核心装饰_《python核心编程》中高级闭包和装饰器理解?
  10. vscode调试时几个常用参数的含义和设置总结
  11. 深入解析Windows操作系统(笔记2)
  12. Blender图解教程:多边形建模命令 之 合并顶点(Merge)
  13. User root is not allowed to impersonate anonymous
  14. python双星号什么运算_Python的星号(*)和双星号(**)用法
  15. 【学习总结】激光雷达与相机外参标定:原理与代码1
  16. Elasticsearch插件安装之cerebro(八)
  17. cpm、ecpm、ocpm
  18. WM8960音频播放
  19. 计算机辅助英语教学mti,计算机辅助翻译与翻译硕士(MTI)专业建设
  20. umpc 安卓 linux双系统,牛人改造旧款UMPC运行四系统 Win7+Mac OS

热门文章

  1. 如何实现对外部php文件的调用,laravel如何引用外部文件
  2. sklearn.decomposition.FastICA实现FastICA算法
  3. python+OpenCV图像处理(九)图像金字塔
  4. MSE和Cross-entropy梯度更新比较
  5. 利用scipy包计算表格线的峰值,还原表格得到表格结构
  6. 王爽 汇编语言第三版 第10章 call 和 ret 指令 以及 子程序设计
  7. 网络 IPC 套接字socket
  8. vue 前端商城框架_前端工程师要掌握几个Vue框架
  9. 1115 Counting Nodes in a BST(甲级)
  10. 自动搜索数据增强方法分享——fast-autoaugment