热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

一、类1.1类修饰符A.是一个接口;B.类的可序列化性由实现java.io.serializable接口的类启用。不实现此接口的类将不具有序列化或反序列化的任何状

一、类


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的一些基本的类的源码整理出来,欢迎大家指正和讨论。

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

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

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

 

 

 

 

 

 

 

 


推荐阅读
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 本文详细介绍了 org.jdesktop.swingx.JXTitledPanel 类中的 setUI() 方法,探讨其功能、使用场景,并提供了多个实际代码示例。 ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 在Java中,this是一个引用当前对象的关键字。如何通过this获取并显示其所指向的对象的属性和方法?本文详细解释了this的用法及其背后的原理。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • 本文介绍了如何在 Node.js 中使用 `setDefaultEncoding` 方法为可写流设置默认编码,并提供了详细的语法说明和示例代码。 ... [详细]
author-avatar
丹丹2502912601
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有