JDK8源码阅读(三) java.io.Serializable

2023-11-09

一、类

1.1 类修饰符

 

A. 是一个接口;

B. 类的可序列化性由实现java.io.serializable接口的类启用。不实现此接口的类将不具有序列化或反序列化的任何状态。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义;

C. 为了使得不可序列化类的子类型被序列化,子类型可能会负责保存和还原父类型的公共、受保护和(如果可访问)包字段的状态。只有子类型扩展的类具有可访问的无参构造函数才能承担初始化类的状态的责任。如果不是这样,则声明类可序列化是错误的,运行时将检测到错误。

D. 在反序列化过程中,将使用类的public或protected无参构造函数初始化不可序列化类的字段。可以序列化的子类必须可以访问无参数构造函数。可序列化子类的字段将从流中还原。

E. 遍历图形时,可能会遇到不支持可序列化接口的对象。在这种情况下,将引发NotSerializableException,并标识不可序列化对象的类。

F. 在序列化和反序列化过程中需要特殊处理的类必须实现具有这些确切签名的特殊方法:

   

   f1. WriteObject方法负责为其特定类写入对象的状态,以便相应的ReadObject方法可以还原它。通过调用out.DefaultWriteObject可以调用保存对象字段的默认机制。该方法不需要关注属于它的超类或子类的状态。通过使用WriteObject方法将单个字段写入ObjectOutputStream或使用DataOutput支持的原始数据类型的方法来保存状态。 

   f2.  readObject方法负责从流中读取并还原类字段。它可以调用in.defaultReadObject来调用默认机制来恢复对象的非静态和非瞬态(non-transient)字段。DefaultReadObject方法使用流中的信息为保存在流中的对象的字段分配当前对象中相应命名的字段。当类演化为添加新字段时,这将处理这种情况。该方法不需要关注属于它的超类或子类的状态。通过使用WriteObject方法将单个字段写入ObjectOutputStream或使用DataOutput支持的基元数据类型的方法来保存状态。

   f3. 如果序列化流未将给定类作为要反序列化的对象的超类列出,则readObjectNoData方法负责为其特定类初始化对象的状态。在接收方使用反序列化实例类的不同版本而不是发送方的情况下,可能会发生这种情况: 接收方的版本扩展了不由发送方版本扩展的类。如果序列化流已被篡改,也可能发生这种情况;因此,尽管源流“敌对”或不完整,但readObjectNoData对于正确初始化反序列化对象非常有用。 

G. 需要指定在将对象写入流时要使用的可选对象的可序列化类应使用准确的签名实现此特殊方法:

   g1. 如果方法存在,则通过序列化调用此WriteReplace方法,并且可以从被序列化对象的类中定义的方法访问它。因此,该方法可以具有私有、受保护和包私有访问。这种方法的子类访问遵循Java可访问性规则。

H. 当从流中读取替换实例时,需要指定替换的类应使用准确的签名实现此特殊方法:

   h1.此readResolve方法遵循与writeReplace相同的调用规则和可访问性规则。

I. 序列化运行时将与每个可序列化类的一个版本号(称为serialversionID)关联,该版本号在反序列化期间用于验证序列化对象的发送方和接收方是否已为该对象加载了与序列化兼容的类。如果接收器为与对应发送方类的serialVersionUID不同的对象加载了一个类,则反序列化将导致InvalidClassException。可序列化类可以通过声明名为“serialVersionUID”的字段显式声明自己的serialVersionUID,该字段必须是静态的、最终的且类型为long,格式如下:

J. 如果序列化类没有显式声明SerialValueUID,则序列化运行时将根据类的各个方面计算该类的默认SerialValueUID值,如Java(TM)对象序列化规范中所描述的。但是,强烈建议所有可序列化类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类详细信息高度敏感,这些详细信息可能因编译器实现而异,因此在反序列化期间可能会导致意外的invalidClassExceptions。因此,为了保证跨Java编译器实现一致的SerialValueUID值,可序列化类必须声明显式SerialValueUID值。还强烈建议显式serialversionuid声明尽可能使用私有修饰符,因为此类声明仅适用于立即声明的类--serialversionuid字段作为继承成员不有用。数组类不能声明显式的serialversionID,因此它们始终具有默认的计算值,但数组类不需要匹配serialversionID值。

 

1.2 类结构图

 

二、字段

1.1 字段列表

无。

 

三、方法

3.1 方法列表

无。

3.2 方法修饰符

无。


3.3 方法详解

3.3.0 [静态]代码块

无。

 

 

四. JDK8源码阅读系列链接

  1. JDK8源码阅读(一) java.util.Object
  2. JDK8源码阅读(二) java.util.Objects
  3. JDK8源码阅读(三) java.io.Serializable   
  4. JDK8源码阅读(四) java.lang.Comparable
  5. JDK8源码阅读(五) java.lang.CharSequence
  6. JDK8源码阅读(六) java.lang.String

注: 今年要把JDK的一些基本的类的源码整理出来,欢迎大家指正和讨论。

         如果有错误的地方,欢迎各位老师指正。

         如果您觉得还不错,点个赞的话  我会很感激的,谢谢~

         转载请注明链接来源即可。

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDK8源码阅读(三) java.io.Serializable 的相关文章

  • Vue 源码解读(12)—— patch

    当学习成为了习惯 知识也就变成了常识 感谢各位的 关注 点赞 收藏和评论 新视频和文章会第一时间在微信公众号发送 欢迎关注 李永宁lyn 文章已收录到 github 仓库 liyongning blog 欢迎 Watch 和 Star 前言
  • spring boot配置类注册深入解析

    前言 spring ApplicationContext的刷新总体来看有两个过程 第一个是注册BeanDefinition 提供整个IOC容器初始化的材料 第二个是根据BeanDefinition加载bean 从spring boot开始
  • (转) serialVersionUID作用

    Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的 在进行反序列化时 JVM会把传来的字节流中的serialVersionUID与本地相应实体 类 的serialVersionUID进行比较 如果相
  • [pytest源码4]-pluggy之Plugin注册逻辑分析

    前言 本篇将详细对plugin的注册逻辑进行分析 个人拙见 有错请各位指出 如果的我的文章对您有帮助 不符动动您的金手指给个Star 予人玫瑰 手有余香 不胜感激 GitHub pluggy注册逻辑分析性 我们来详细分析一下plugin的注
  • iterable java_如何在Java中将Iterable转换为Collection?

    iterable java There are various ways to convert Iterable to Collection in Java programming language 有多种方法可以用Java编程语言将Ite
  • Java PECS(Producer Extends Consumer Super)原则

    在看 Alibaba 开发手册时遇到 PECS 原则 刚开始阅读时感觉比较绕 也搜索了一些博文参考 个人觉得 Stackoverflow 的这篇文章比较实用 What is PECS Producer Extends Consumer Su
  • 关于时间的最小单位

    关于时间的最小单位 以前很少研究过这个问题 一次业务上的需求 要求计算的性能要求很高 添加 读取 更新数据的效率都要是毫秒以下 为了测试 不得不在代码中通过前后添加类似这样的语句来调试 long start System currentTi
  • Android 序列化问题

    我创建了一个类 它有几个成员变量 所有这些变量都是可序列化的 除了一个位图 我尝试扩展位图并实现可序列化 但不认为位图是最终类 我想保存该类 它基本上构成了游戏的当前状态 以便玩家可以拾取并加载游戏 在我看来 我有两个选择 1 寻找另一种保
  • 在 Android 中使用 Serialized 不好吗?

    我读过很多帖子和文章 称赞 Parcelable 的速度比 Serialized 快 我已经使用两者通过意图在活动之间传递数据有一段时间了 但在两者之间切换时尚未注意到任何速度差异 我必须传输的典型数据量是 5 到 15 个嵌套对象 每个对
  • 序列化 Drawable 时出现问题

    我有一个对象 它具有三个字段 两个字符串和一个Drawable public class MyObject implements Serializable private static final long serialVersionUID
  • 通过意图传递可序列化对象

    这是我第一次尝试寻求解决我的问题的方法 所以请尽量友善 通过简单的搜索 我在这个网站上找到了许多我处理的问题的解决方案 但我想这次我没有运气 我发现没有什么适合我的问题 所以我结束了问一个新问题 我试图通过意图将对象从一个活动传递到另一个活
  • 为什么我应该始终将异常设置为[可序列化]? (。网)

    参考使自定义 NET 异常可序列化的正确方法是什么 and 所有 NET 异常都是可序列化的吗 为什么我的异常应该是可序列化的 有人说 如果第三方库定义的自定义异常不可序列化 可以将其视为错误 为什么 为什么异常在这方面与其他类不同 因为您
  • 开源Cloudreve云盘系统源码/ 支持本地储存+对接各大对象储存/带云盘系统安装教程/公私兼备网盘系统

    源码介绍 Cloudreve云盘系统源码 它不仅支持本地储存 而且还对接各大对象储存 附带云盘系统安装教程 轻松搭建个人网盘 拥有美观界面 云盘系统安装教程 公私兼备网盘系统 多功能仿百度网盘源码 测试环境 PHP7 1 MYSQL5 6
  • 开源Cloudreve云盘系统源码/ 支持本地储存+对接各大对象储存/带云盘系统安装教程/公私兼备网盘系统

    源码介绍 Cloudreve云盘系统源码 它不仅支持本地储存 而且还对接各大对象储存 附带云盘系统安装教程 轻松搭建个人网盘 拥有美观界面 云盘系统安装教程 公私兼备网盘系统 多功能仿百度网盘源码 测试环境 PHP7 1 MYSQL5 6
  • Java 中可序列化和外部化有什么区别?

    有什么区别Serializable http java sun com javase 6 docs api java io Serializable html and Externalizable http java sun com jav
  • HashMap 不可序列化

    HashMap with Serializable键 值应该是Serializable 但这对我不起作用 尝试了其他一些IO流 没有一个有效 有什么建议吗 测试代码 public class SimpleSerializationTest
  • 有没有什么方法可以禁用 ORMLite 检查使用 DataType.SERIALIZABLE 声明的字段是否实现了可序列化?

    问题标题已经说明了一切 我有一个这样声明的字段 DatabaseField canBeNull false dataType DataType SERIALIZABLE List
  • Serialized接口的DTO实现

    Java DTO 模型对象是否必须实现序列化 如果是这样为什么 如果不是 对性能等有何影响 DTO 通常是数据传输对象 它不必使用 Java 序列化 但如果不使用 则需要遵循一些其他约定 这不是性能问题 就像您使用 Java 序列化一样 它
  • 在 WebAPI 中的模型上使用可序列化属性

    我有以下场景 我正在使用 WebAPI 并根据模型将 JSON 结果返回给消费者 我现在有额外的要求 将模型序列化为 base64 以便能够将它们保存在缓存中和 或将它们用于审计目的 问题是当我添加 Serializable 属性到模型 因
  • Hazelcast 可序列化映射 ClassNotFound 异常

    我正在尝试在一个简单的 Web 应用程序中实现 Hazelcast 我正在尝试将自定义对象存储到我的 Hazelcast Map 中 并在我的 Bid 对象类中实现 Serialized 并进行必要的导入 import java io Se

随机推荐

  • Android webview支持获取本地图片或拍照

    Android webview支持获取本地图片或拍照 package com wshoto user anyong ui activity public class BBSActivity extends InitActivity Bind
  • 计算机经典书籍(转载,难以找到出处)

    学计算机也有几年了 眼看明年就要毕业 在这里总结一下我看过的书 并推荐一些我认为好的书 还有一些是我听说好的但没看过的 也写在这里 对于下面的书 如果看过的我会按自己的读后感打一个分和一些评价 评分及供参考 如有问题 欢迎讨论 好的 现在开
  • python机器学习----模型选择1(方法、指标)

    一 模型选择的方法及相关指标 1 损失函数通常有0 1损失 平方损失 绝对值损失和对数损失 2 通常用测试集对模型评估 评估的方法有留出法 交叉验证法 留一法 自助法 留出法 直接将数据分为对立的三部分 也可以是两部分 此时训练集也是验证集
  • 网页爬虫逆向与AST入门系列教程(三、使用工具生成和可视化AST)

    网页爬虫逆向与AST入门系列教程 第三部分 使用工具生成和可视化AST 在前两篇文章中 我们学习了什么是AST以及它在网页爬虫逆向中的应用 本篇将介绍一些工具和方法 帮助我们生成和可视化AST 1 AST生成工具 为了生成AST 我们可以使
  • 多重背景图片(background属性缩写)

    多重背景图片 格式 background url images animal1 png no repeat url images animal2 png no repeat 加入定位属性分开图片 background url images
  • BUUCTF——Basic

    Linux Labs 启动靶机 根据题目与ssh有关 并且给出了用户名和密码 使用kail进行渗透 SSH是一种网络协议 用于计算机之间的加密登录 它通常用于Linux系统之间的远程登录 文件传输和其他网络服务 SSH工作原理简单来说是 客
  • 【Qt编程笔记】采用遍历方式删除QList中全部元素的方法

    QList类是Qt提供的链表模板类 在日常工作和学习中经常会用到 虽然QList操作十分便利 但是在用遍历方式删除全部元素时很可能会因为疏忽造成没有将元素全部删除 从而给程序留下隐患 下面小结一下采用遍历方式删除QList中全部元素的方法
  • 由于找不到d3dx9_43.dll,有什么可靠的修复方法?

    由于找不到d3dx9 43 dll 无法继续执行代码 这种情况大家是否有遇见过 其实就算没遇到过 大家应该也有遇到别的dll文件丢失吧 道理都一样 都是dll文件丢失 我们只需要把它给修复就可以了 不同的dll只是负责的功能不一样而已 下面
  • Css层叠优先级只会这两招还远远不够

    作为一个玩前端的 ps软件中的图层都知道吧 多个图层层叠就可以组成丰富多彩的图片 所以图层就有层叠顺序了 Css的层叠原理也是差不多 只不过Css是通过多个盒子层叠形成丰富多彩的图片 Css层叠优先级设置不就是z index和 import
  • linux 测试网络连通性方法

    一 telnet 方法 telnet 协议是 TCP IP 协议族中的一员 是 Internet 远程登陆服务的标准协议和主要方式 它为用户提供了在本地计算机上完成远程主机工作的能力 因此我们可以使用telnet 来测试远程机器的连通性 t
  • VMware安装RHEL 8.2(红帽)

    一 创建虚拟机 打开VMware 点击 创建新的虚拟机 点击自定义 下一步 选择兼容性 15 x 兼容性选VMware的版本 稍后安装操作系统 选择镜像对应的操作系统类型及版本 系统镜像按自己准备的选择即可 自定义虚拟机名称及安装的位置 名
  • 数组的方法以及特征

    数组变成一个字符串 1 join 可以在每一个元素中加一个字符串 2 toString pop 删除数组最后一个元素 push 增加数组 reverse 反转 slice 从下标开始取 sort 对数组进行排序 splice 删除数组的某几
  • 取消全部呼叫转移代码_中国移动的卡取消呼叫转移的快捷方式是什么?

    展开全部 取消已设置的所有呼转可用手机拨打 002 取62616964757a686964616fe59b9ee7ad9431333365663562消关机或无信号时转移可用手机拨打 62 取消无人接听时转移可用手机拨打 61 取消遇忙音占
  • 即时通讯(IM)开源项目OpenIM对WebAssembly支持,提升web端体验

    WebAssembly 是什么 2019 年 12 月 W3C 标准批准了第四种官方语言 WebAssembly Wasm 这种语言在结构 使用和功能方面与以前的语言有很大不同 WebAssembly 是一种新的编码方式 可以在现代的Web
  • [1138]java中json的使用和解析

    文章目录 1 创建json对象 1 1 创建JSONObject对象 1 2 创建JSONArray对象 2 解析json 2 1 官方json包解析 2 2 fastjson解析 2 3 jackson解析 1 创建json对象 1 1
  • 关于时区的时间的详解,比如UTC\GMT等

    来源 UTC 和 GMT 及 北京时间的关系 UTC和GMT 这两者几乎是同一概念 它们都是指的格林尼治标准时间 只不过UTC的称呼更为正式一点 两者的区别在于前者是一个天文 上的概念 而 后者是基于一个原子钟 在UTC中 每一年或两年会有
  • 移植micropython最小工程到mm32f3270微控制器

    移植micropython最小工程到mm32f3270微控制器 苏勇 2021 08 文章目录 移植micropython最小工程到mm32f3270微控制器 Introduction 初试micropython v1 6 增加MM32的移
  • OpenCV图像梯度(Sobel和Scharr)

    OpenCV图像梯度 Sobel和Scharr 1 图像梯度是什么 2 图像梯度的用途 3 图像梯度的使用 参考 这篇博客将介绍图像渐变以及如何使用OpenCV的cv2 Sobel计算Sobel渐变和Scharr渐变 1 图像梯度是什么 图
  • CMake - 使用 target_sources() 提高源文件处理能力

    翻译自https crascit com 2016 01 31 enhanced source file handling with target sources 使用 target sources 提高源文件处理能力 在CMake项目中
  • JDK8源码阅读(三) java.io.Serializable

    一 类 1 1 类修饰符 A 是一个接口 B 类的可序列化性由实现java io serializable接口的类启用 不实现此接口的类将不具有序列化或反序列化的任何状态 可序列化类的所有子类型本身都是可序列化的 序列化接口没有方法或字段