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

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

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

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

 

 

 

 

 

 

 

 


推荐阅读
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了Java中的输入输出(IO)流,包括其基本概念、分类及应用。IO流是用于在程序和外部资源之间传输数据的一套API。根据数据流动的方向,可以分为输入流(从外部流向程序)和输出流(从程序流向外部)。此外,还涵盖了字节流和字符流的区别及其具体实现。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • andr ... [详细]
  • 解决Element UI中Select组件创建条目为空时报错的问题
    本文介绍如何在Element UI的Select组件中使用allow-create属性创建新条目,并处理创建条目为空时出现的错误。我们将详细说明filterable属性的必要性,以及default-first-option属性的作用。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 不确定性|放入_华为机试题 HJ9提取不重复的整数
    不确定性|放入_华为机试题 HJ9提取不重复的整数 ... [详细]
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社区 版权所有