文档

Java™ 教程-Java Tutorials 中文版
Bean 持久性
Trail: JavaBeans(TM)
Lesson: Advanced JavaBeans Topics

Bean 持久性

当 bean 的属性,字段和状态信息保存到存储并从存储中获取时,bean 具有持久性。组件模型提供了持久性机制,使组件的状态可以存储在非易失性位置以供以后获取。

使持久化成为可能的机制称为 serialization (序列化)。对象序列化意味着将对象转换为数据流并将其写入存储。任何使用该 bean 的 applet,应用程序或工具都可以通过反序列化“重新构建”它。然后该对象恢复到其原始状态。

例如,Java 应用程序可以序列化 Microsoft Windows 机器上的 Frame 窗口,序列化文件可以通过电子邮件发送到 Solaris 机器,然后 Java 应用程序可以将 Frame 窗口恢复到存在于 Microsoft Windows 机器上的确切状态。

任何使用该 bean 的 applet,应用程序或工具都可以通过 deserialization (反序列化)“重新构建”它。

所有 bean 必须可持久化。要可持久化,bean 必须通过实现 java.io.Serializable(在 API 参考文档中)接口或 java.io.Externalizable(在 API 参考文档中)接口。这些接口为你提供自动序列化和自定义序列化的选择。如果类的继承层次结构中的任何类实现 SerializableExternalizable,则该类是可序列化的。

可序列化的类

只要该类或父类实现 java.io.Serializable 接口,任何类都是可序列化的。可序列化类的示例包括 ComponentStringDateVectorHashtable。因此,可以序列化 Component 类的任何子类,包括 Applet。不支持序列化的值得注意的类包括 ImageThreadSocketInputStream。尝试序列化这些类型的对象将导致 NotSerializableException

Java Object Serialization API 自动将 Serializable 对象的大多数字段序列化为存储流。这包括基本类型,数组和字符串。API 不会序列化或反序列化标记为 transient (瞬态)或 static (静态)的字段。

控制序列化

你可以控制 Bean 所经历的序列化级别。控制系列化的三种方法是:

默认序列化:Serializable 接口

Serializable 接口通过使用 Java 对象序列化工具提供自动序列化。Serializable 声明没有方法;它充当标记,告诉对象序列化工具你的 bean 类是可序列化的。标记你的类 Serializable 意味着你告诉 Java 虚拟机(JVM)你确保你的类可以使用默认序列化。以下是使用 Serializable 接口的一些重要要点:

使用 transient 关键字选择性序列化

要从 Serializable 对象中的序列化中排除字段,请使用 transient 修饰符标记字段。

transient int status;

默认序列化不会序列化 transientstatic 字段。

选择性序列化:writeObject 和 readObject

如果可序列化类包含以下两种方法之一(签名必须准确),则不会进行默认序列化。

private void writeObject(java.io.ObjectOutputStream out)
    throws IOException;
private void readObject(java.io.ObjectInputStream in)
    throws IOException, ClassNotFoundException;

你可以通过编写自己的 writeObjectreadObject 方法的实现来控制更复杂对象的序列化。当需要序列化默认序列化无法处理的对象时,或者需要将数据添加到不是对象数据成员的序列化流时,需要对需要序列化的内容进行更好的控制时,实现 writeObject。实现 readObject 以重建使用 writeObject 编写的数据流。

Externalizable 接口

当你需要完全控制 bean 的序列化时(例如,在编写和读取特定文件格式时),请使用 Externalizable 接口。要使用 Externalizable 接口,你需要实现两个方法:readExternalwriteExternal。实现 Externalizable 的类必须具有无参构造函数。


Previous page: Advanced JavaBeans Topics
Next page: Long Term Persistence