文档

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 参考文档中)接口。这些接口为你提供自动序列化和自定义序列化的选择。如果类的继承层次结构中的任何类实现 Serializable 或 Externalizable,则该类是可序列化的。

可序列化的类

只要该类或父类实现 java.io.Serializable 接口,任何类都是可序列化的。可序列化类的示例包括 Component,String,Date,Vector 和 Hashtable。因此,可以序列化 Component 类的任何子类,包括 Applet。不支持序列化的值得注意的类包括 Image,Thread,Socket 和 InputStream。尝试序列化这些类型的对象将导致 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;

默认序列化不会序列化 transient 和 static 字段。

选择性序列化:writeObject 和 readObject

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

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

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

Externalizable 接口

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


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