java.beans

接口
异常
注释
java.lang.Object
  继承者 java.beans.PersistenceDelegate
直接已知子类:
DefaultPersistenceDelegate

public abstract class PersistenceDelegate
     
extends Object

PersistenceDelegate 类负责根据类的公共 API 中的方法表示给定类的实例状态。不是根据它完成时的样子,通过(例如)ObjectOutputStream 使用的 readObjectwriteObject 方法,将持久存储的责任与类本身关联起来,而是让使用此委托模型的类似 XMLEncoder 的流可以拥有不依赖于类本身控制的自己的行为。通常,该类是放置信息的最佳地方,它可以很容易地在此委托方案中表示约定,以完成操作。不过有时会出现这样的情况,单个类中的一个很小的问题阻止了整个对象图形的写入,这可能会使得应用程序开发人员毫无办法,只有试图局部隐藏有问题的类,或使用替代的持久存储技巧。在这种情况下,委托模型提供了一个相关的清理机制,使应用程序开发人员干涉序列化过程的所有部分,不需要对不是应用程序本身一部分的类的实现进行修改。

除了使用委托模型,此持久方案不同于传统序列化方案的地方在于,它需要 writeObject 方法的仿真,而不需要相应的 readObject 方法。根据此公共 API,writeObject 仿真对每个实例编码,并且不需要定义 readObject 仿真,因为读取序列化格式的过程由方法调用的语义定义,正如 Java Language Specification 中展示的那样。打破 writeObjectreadObject 实现之前的依赖关系,这可能会改变版本,因此它是使此技术产生的档案不受它们所参考类的私有实现更改影响的关键。

持久委托可以控制对象持久性的所有方面,其中包括:

  • 确定某一实例是否可以转变成同一个类的另一个实例。
  • 通过调用公共构造方法或公共工厂方法实例化该对象。
  • 对该对象进行实例化。

从以下版本开始:
1.4
另请参见:
XMLEncoder

构造方法摘要
PersistenceDelegate()
           
 
方法摘要
protected  void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder out)
          产生一系列对 newInstance 有副作用的语句,使得新实例等于 oldInstance
protected abstract  Expression instantiate(Object oldInstance, Encoder out)
          返回其值为 oldInstance 的表达式。
protected  boolean mutatesTo(Object oldInstance, Object newInstance)
          如果 oldInstance等效 副本可以可以通过应用 newInstance 的一系列语句来创建,则返回 true。
 void writeObject(Object oldInstance, Encoder out)
          writeObject 是持久性的一个入口点,由传统委托模式中的 Encoder 使用。
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

PersistenceDelegate

public PersistenceDelegate()
方法详细信息

writeObject

public void writeObject(Object oldInstance,
                        Encoder out)
writeObject 是持久性的一个入口点,由传统委托模式中的 Encoder 使用。尽管此方法不是最终方法,但在普通环境下不必为其创建子类。

此实现首先检查流是否已经遇到此对象。接着调用 mutatesTo 方法查看是否可以将从流中返回的候选者转变成 oldInstance 的精确副本。如果可以,则调用 initialize 方法执行初始化。如果不可以,则从流中移除该候选者,并调用 instantiate 方法为此对象创建一个新候选者。

参数:
oldInstance - 将由此表达式创建的实例。
out - 将在其中写入此表达式的流。

mutatesTo

protected boolean mutatesTo(Object oldInstance,
                            Object newInstance)
如果 oldInstance等效 副本可以可以通过应用 newInstance 的一系列语句来创建,则返回 true。在此方法的规范中,等效是指修改后的实例其公共 API 中相关方法的行为与 oldInstance 没有区别。[注:在这里使用短语 相关 方法而不是使用 所有 方法只是因为,为了保证完全正确,类似 hashCodetoString 这样的方法阻止大多数类实际产生其实例的无区别副本]。

如果两个实例的类是相同的,则默认行为返回 true

参数:
oldInstance - 要复制的实例。
newInstance - 要修改的实例。
返回:
如果通过对 oldInstance 进行一系列的修改能够创建 newInstance 的等效副本,则返回 true。

instantiate

protected abstract Expression instantiate(Object oldInstance,
                                          Encoder out)
返回其值为 oldInstance 的表达式。此方法用于描述应该用来创建给定对象的构造方法或工厂方法。例如,用于 Field 类的持久委托的 instantiate 方法可以定义如下:
 Field f = (Field)oldInstance;
 return new Expression(f, f.getDeclaringClass(), "getField", new Object[]{f.getName()});
 
注意,这里声明了所返回表达式的值,因此该表达式的值(由 getValue 返回)将等于 oldInstance

参数:
oldInstance - 将由此表达式创建的实例。
out - 将在其中写入此表达式的流。
返回:
值为 oldInstance 的表达式。

initialize

protected void initialize(Class<?> type,
                          Object oldInstance,
                          Object newInstance,
                          Encoder out)
产生一系列对 newInstance 有副作用的语句,使得新实例 等于 oldInstance。在此方法的规范中,等效是指在该方法返回之后,修改后的实例其公共 API 中所有方法的行为都与 newInstance 没有区别。

该实现通常通过产生一系列涉及 oldInstance 及其公共可用状态的 "what happened" 语句来达到此目的。这些语句使用其 writeExpression 方法发送到输出流中,在输入流读取期间,在模拟输入流状态的复制环境中返回涉及元素的表达式。每个返回的语句都将使用新环境中所存在对象代替旧环境中的所有实例。特别是这些语句目标的引用,开始它们是 oldInstance 的引用,返回时成为 newInstance 的引用。执行这些语句会以新环境中对象的一系列修改的形式,实现两个对象状态的递增调整。到 initialize 方法返回时,则无法通过使用公共 API 来区别两个实例。最重要的是,用来使这些对象看起来相同的步骤顺序将被输出流记录,当刷新流时,将形成实际的输出。

默认实现调用该类型超类的 initialize 方法。

参数:
oldInstance - 要复制的实例。
newInstance - 要修改的实例。
out - 保存所有应该写入的初始化语句的流。