《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.4.3 修改默认的序列化机制

简介: 本节书摘来华章计算机《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一书中的第2章 ,第2.4.3节,[美] 凯S.霍斯特曼(Cay S. Horstmann) 著陈昊鹏 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.4.3 修改默认的序列化机制

某些数据域是不可以序列化的,例如,只对本地方法有意义的存储文件句柄或窗口句柄的整数值,这种信息在稍后重新加载对象或将其传送到其他机器上时都是没有用处的。事实上,这种域的值如果不恰当,还会引起本地方法崩溃。Java拥有一种很简单的机制来防止这种域被序列化,那就是将它们标记成是transient的。如果这些域属于不可序列化的类,你也需要将它们标记成transient的。瞬时的域在对象被序列化时总是被跳过的。
序列化机制为单个的类提供了一种方式,去向默认的读写行为添加验证或任何其他想要的行为。可序列化的类可以定义具有下列签名的方法:
image

之后,数据域就再也不会被自动序列化,取而代之的是调用这些方法。
下面是一个典型的示例。在java.awt.geom包中有大量的类都是不可序列化的,例如Point2D.Double。现在假设你想要序列化一个LabeledPoint类,它存储了一个String和一个Point2D.Double。首先,你需要将Point2D.Double标记成transient,以避免抛出NotSerializableException。
image

在writeObject方法中,我们首先通过调用defaultWriteObject方法写出对象描述符和String域label,这是ObjectOutputStream类中的一个特殊的方法,它只能在可序列化类的writeObject方法中被调用。然后,我们使用标准的DataOutput调用写出点的坐标。
image

另一个例子是java.util.Date类,它提供了自己的readObject和writeObject方法,这些方法将日期写出为从纪元(UTC时间1970年1月1日0点)开始的毫秒数。Date类有一个复杂的内部表示,为了优化查询,它存储了一个Calendar对象和一个毫秒计数值。Calendar的状态是冗余的,因此并不需要保存。
readObject和writeObject方法只需要保存和加载它们的数据域,而不需要关心超类数据和任何其他类的信息。
除了让序列化机制来保存和恢复对象数据,类还可以定义它自己的机制。为了做到这一点,这个类必须实现Externalizable接口,这需要它定义两个方法:
image

与前面一节描述的readObject和writeObject不同,这些方法对包括超类数据在内的整个对象的存储和恢复负全责。在写出对象时,序列化机制在输出流中仅仅只是记录该对象所属的类。在读入可外部化的类时,对象输入流将用无参构造器创建一个对象,然后调用readExternal方法。下面展示了如何为Employee类实现这些方法:
image

警告:readObject和writeObject方法是私有的,并且只能被序列化机制调用。与此不同的是,readExternal和writeExternal方法是公共的。特别是,readExternal还潜在地允许修改现有对象的状态。

相关文章
|
1天前
|
存储 安全 Java
day24:Java零基础 - 序列化与反序列化
【7月更文挑战第24天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
9 1
|
2天前
|
Java 开发者 UED
深入理解Java中的异常处理机制
【7月更文挑战第24天】在Java的世界中,异常处理是维护程序健壮性的关键。本文将探索Java异常处理的核心概念,从基本语法到高级技巧,揭示如何优雅地管理运行时错误。我们将通过实际代码示例,展示捕获、声明和自定义异常的策略,并探讨如何在多线程环境下有效处理异常。
|
4天前
|
存储 安全 Java
day23:Java零基础 - 反序列化
【7月更文挑战第23天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
11 2
|
5天前
|
存储 安全 Java
day22:Java零基础 - 序列化
【7月更文挑战第22天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
11 3
|
5天前
|
自然语言处理 安全 Java
Substrate VM如何处理Java序列化
Substrate VM如何处理Java序列化
|
11天前
|
Java
Java中的异常处理机制深度解析
本文旨在深入探讨Java语言中异常处理的机制,从基础概念到高级应用,全面剖析try-catch-finally语句、自定义异常以及异常链追踪等核心内容。通过实例演示和代码分析,揭示异常处理在Java程序设计中的重要性和应用技巧,帮助读者构建更为健壮和易于维护的程序。
|
15天前
|
Java 数据库连接 开发者
Java中的异常处理机制与最佳实践
本文旨在深入探讨Java的异常处理机制,揭示异常处理在程序设计中的重要性及其对软件质量的影响。文章将通过案例分析,阐释异常处理的最佳实践,包括自定义异常类的创建、异常链的使用以及如何避免常见的异常处理陷阱。此外,还将讨论如何利用现代Java版本的特性来优化异常处理策略,提升代码的健壮性和可读性。
|
16天前
|
安全 Java 开发者
Java面试题:什么是Java 15中的密封类以及其限制?还有哪些其他特性用于限制类继承的机制吗?
Java面试题:什么是Java 15中的密封类以及其限制?还有哪些其他特性用于限制类继承的机制吗?
19 1
|
16天前
|
监控 安全 Java
Java面试题:描述Java反射机制及其应用场景,并讨论其优缺点。
Java面试题:描述Java反射机制及其应用场景,并讨论其优缺点。
22 1
|
2天前
|
监控 算法 Java
Java中的垃圾收集机制:原理与优化实践
在Java的内存管理领域中,垃圾收集(Garbage Collection, GC)扮演着至关重要的角色。本文将深入探讨Java垃圾收集的核心概念、工作机制以及性能调优策略。通过具体案例分析,我们揭示不同垃圾收集器的行为模式并讨论如何根据应用场景做出合理选择。针对JVM监控和诊断工具的使用也将被详细介绍,旨在为读者提供一套系统的解决方案,以实现Java应用的性能优化。