《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还潜在地允许修改现有对象的状态。

相关文章
|
2月前
|
开发框架 Java API
最新Java基础系列课程--Day13-高级特性(二)
最新Java基础系列课程--Day13-高级特性
|
2月前
|
存储 算法 Java
从零开始学习 Java:简单易懂的入门指南之IO序列化、打印流、压缩流(三十三)
从零开始学习 Java:简单易懂的入门指南之IO序列化、打印流、压缩流(三十三)
|
1天前
|
Java 数据安全/隐私保护
Java的包机制
Java的包机制
17 8
Java的包机制
|
3天前
|
开发框架 Java 程序员
java反射机制
了解java反射机制
|
3天前
|
存储 自然语言处理 Java
java缓冲流、转换流、序列化流、打印流
java缓冲流、转换流、序列化流、打印流介绍
|
4天前
|
存储 Java API
Java基础篇----包机制与JavaDoc
Java基础篇----包机制与JavaDoc
19 3
|
7天前
|
Java 数据库连接
Java中的异常处理机制及其应用
【2月更文挑战第5天】异常处理是Java程序设计中非常重要的一部分。本文将介绍Java中的异常处理机制,包括异常的分类、捕获和处理方式。同时,还将探讨异常处理在实际开发中的应用,并给出一些实例代码。
|
8天前
|
安全 前端开发 Java
百度搜索:蓝易云【JAVA系列之类加载机制详解】
类加载机制使得Java具有动态性和灵活性,允许在运行时动态加载新的类和资源。这也为Java的热部署和插件化开发提供了基础。类加载器的层次结构和双亲委派机制保证了类的安全性和共享性,使得Java应用具有高度的可靠性和稳定性。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
9 1
|
9天前
|
Java 编译器 开发者
Java中的异常处理机制详解
Java中的异常处理机制详解
|
10天前
|
设计模式 安全 Java
玩转Java反射机制
玩转Java反射机制
42 1