Bean Persistence
当 bean 的属性,字段和状态信息保存到存储中并从存储中检索时,它具有持久性。组件模型提供了一种持久性机制,该机制使组件的状态能够存储在非易失性位置中,以便以后进行检索。
使持久化成为可能的机制称为* serialization *。对象序列化是指将对象转换为数据流并将其写入存储。然后,使用该 bean 的任何 applet,应用程序或工具都可以通过反序列化来“重构”它。然后将对象还原到其原始状态。
例如,Java 应用程序可以序列化 Microsoft Windows 计算机上的“框架”窗口,序列化的文件可以通过电子邮件发送到 Solaris 计算机,然后 Java 应用程序可以将“框架”窗口还原到计算机上已存在的确切状态。 Microsoft Windows 计算机。
然后,使用该 bean 的任何 applet,应用程序或工具都可以通过反序列化来“重构”它。
所有的 bean 必须坚持下去。为了持久化,您的 bean 必须通过实现java.io.Serializable(在 API 参考文档中)interface或java.io.Externalizable(在 API 参考文档中)interface来支持序列化。这些interface为您提供自动序列化和自定义序列化的选择。如果类的继承层次结构中的任何类实现Serializable
或Externalizable
,则该类是可序列化的。
可序列化的类
只要该类或父类实现java.io.Serializable
interface,任何类都可以序列化。可序列化类的示例包括Component
,String
,Date
,Vector
和Hashtable
。因此,Component
类的任何子类(包括Applet
)都可以序列化。不支持序列化的著名类包括Image
,Thread
,Socket
和InputStream
。try序列化这些类型的对象将导致NotSerializableException
。
Java 对象序列化 API 自动将可序列化对象的大多数字段序列化到存储流。这包括基本类型,数组和字符串。 API 不会序列化或反序列化标记为瞬态或静态的字段。
Controlling Serialization
您可以控制 bean 进行的序列化级别。控制序列化的三种方法是:
-
自动序列化,由
Serializable
interface实现。 Java 序列化软件可序列化整个对象,瞬时字段和静态字段除外。 -
定制的序列化。通过使用
transient
(或static
)修饰符进行标记,有选择地排除不需要序列化的字段。 -
定制的文件格式,由
Externalizable
interface及其两种方法实现。 Bean 以特定的文件格式编写。
默认序列化:可序列化的interface
Serializable
interface使用 Java 对象序列化工具提供自动序列化。 Serializable
不声明任何方法;它充当标记,告诉对象序列化工具您的 bean 类是可序列化的。将您的类标记为Serializable
意味着您正在告诉 Java 虚拟机(JVM),您已确保您的类可以使用默认序列化工作。以下是有关使用Serializable
interface的一些重要信息:
-
实现
Serializable
的类必须有权访问超类型的“无参数构造函数”。当从.ser
文件“重构”对象时,将调用此构造函数。 -
如果您已经在超类中实现了
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
编写的数据流。
可外部化的interface
当您需要完全控制 bean 的序列化时(例如,在写入和读取特定文件格式时),请使用Externalizable
interface。要使用Externalizable
interface,您需要实现两种方法:readExternal
和writeExternal
。实现Externalizable
的类必须具有无参数的构造函数。