最近观看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. Luogu P1087 FBI树
  2. ruby json转化成对象_系统架构迁移实例:从Ruby到Rust
  3. java获取内存基址_安卓逆向|菜鸟的FRIDA学习笔记:内存读写
  4. SAP HANA云平台YaaS,你不知道的三件事
  5. CSS相邻兄弟选择器
  6. error c4996: 'fopen' This function or variable may be unsafe如何解决
  7. GridView直接更新数据,kartik\grid\EditableColumn用法 [ 2.0 版本 ]
  8. WinForms多线程编程之摇奖程序
  9. 6年级学Python,高中学AI?这6本书,助你找回输掉的起跑线
  10. 3-2Tensor的基本定义
  11. import java.util_importjava.util.*;classKeyMaster{publi..._考试资料网
  12. android代码设置digits,andorid editext android:digits=abcdefghijklmnopqrstuvwxyz用代码写来控制规则该怎么写呢?...
  13. 杭州地区,街道sql,用于项目的地址查询
  14. UltraVNC远程控制其他电脑
  15. 用数据说话:北京房价数据背后的数据
  16. bzoj-2818 Gcd
  17. 水果店圈子:水果店开业前需要做的准备,水果店开业当天要注意哪些问题
  18. 搞中视频搬运赚钱,只因我用了这些方法
  19. Educoder - Java类和对象之对象组合之求圆锥体表面积
  20. #医疗算法招聘:【医学影像AI公司-图像算法工程师】(招2人)

热门文章

  1. stm32f103移植到f0_STM32F042替换STM32F103
  2. python实现采样函数_python中resample函数实现重采样和降采样代码
  3. 华为手机怎么使用读卡器_华为手机使用小窍门
  4. linux系统下codeblocks控制台打印中文乱码
  5. C++学习之路 | PTA乙级—— 1032 挖掘机技术哪家强 (20 分)(精简)
  6. 快速实现一个室内空气质量检测仪
  7. jenkins+k8s实现持续集成
  8. MagicRecord For IOS API深层解析
  9. python list是数组还是链表实现的_python 数据结构 list和链表实现栈的三种方法
  10. 三菱modbusRTU通讯实例_实例 | 三菱PLC接线图干货,FX5U模块硬件