- java.lang.Object
-
- java.beans.PersistenceDelegate
-
- 已知直接子类:
-
DefaultPersistenceDelegate
public abstract class PersistenceDelegate extends Object
PersistenceDelegate类负责根据类的公共API中的方法表达给定类的实例的状态。 相反关联的持久性与类本身完成,例如,由责任readObject
种writeObject
由所使用的方法ObjectOutputStream
,溪流如XMLEncoder
其中使用该代理模型可以有自己的行为独立控制的类本身。 通常,该类是放置此类信息的最佳位置,并且可以在此委派方案中轻松表达惯例以实现此目的。 然而,有时候,单个类中的一个小问题会阻止编写整个对象图,这可能使应用程序开发人员无法求助,而是尝试在本地隐藏有问题的类或使用替代的持久性技术。 在这种情况下,委托模型为应用程序开发人员提供了一个相对干净的机制,可以干预序列化过程的所有部分,而不需要对不属于应用程序本身的类的实现进行修改。除了使用委托模型之外,该持久性方案与传统的序列化方案的不同之处在于需要
writeObject
方法的模拟,而没有相应的readObject
方法。writeObject
模拟按其公共API对每个实例进行编码,并且不需要定义readObject
模拟,因为读取序列化表单的过程由Java语言规范中规定的方法调用的语义定义。 打破writeObject
和readObject
实现之间的依赖关系,这可能会因版本而readObject
,是使这种技术生成的存档不受其所引用的类的私有实现中的更改影响的关键因素。持久性委托可以控制对象持久性的所有方面,包括:
- 确定实例是否可以变异为同一个类的另一个实例。
- 通过调用公共构造函数或公共工厂方法来实例化对象。
- 执行对象的初始化。
- 从以下版本开始:
- 1.4
- 另请参见:
-
XMLEncoder
-
-
构造方法摘要
构造方法 构造器 描述 PersistenceDelegate()
-
方法摘要
所有方法 实例方法 抽象方法 具体的方法 变量和类型 方法 描述 protected void
initialize(类<?> 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)
如果可以通过将一系列语句应用于newInstance
来创建oldInstance
的 等效副本,则返回true。void
writeObject(Object oldInstance, Encoder out)
writeObject
是持久性的单一入口点,在传统的委派模式下由Encoder
使用。
-
-
-
方法详细信息
-
writeObject
public void writeObject(Object oldInstance, Encoder out)
writeObject
是持久性的单一入口点,在传统的委派模式下由Encoder
使用。 虽然这种方法不是最终的,但在正常情况下不应该是子类。此实现首先检查流是否已遇到此对象。 接下来调用
mutatesTo
方法以查看从流中返回的候选者是否可以变异为oldInstance
的准确副本。 如果可以,则调用initialize
方法来执行初始化。 如果不是,则从流中删除候选项,并调用instantiate
方法为该对象创建新的候选项。- 参数
-
oldInstance
- 将由此表达式创建的实例。 -
out
- 将写入此表达式的流。 - 异常
-
NullPointerException
- 如果out
是null
-
mutatesTo
protected boolean mutatesTo(Object oldInstance, Object newInstance)
如果可以通过将一系列语句应用于newInstance
来创建oldInstance
的等效副本,则返回true。 在此方法的规范中,我们的意思是等效,修改后的实例在其公共API中的相关方法的行为中与oldInstance
无法区分。 [注意:我们在这里使用短语相关方法而不是所有方法只是因为,严格来说,像hashCode
和toString
这样的方法toString
防止大多数类产生真正难以区分的实例副本]。如果两个实例的类相同,则默认行为将返回
true
。- 参数
-
oldInstance
- 要复制的实例。 -
newInstance
- 要修改的实例。 - 结果
-
真要是的等效副本
newInstance
可通过应用一系列突变要创建oldInstance
。
-
instantiate
protected abstract Expression instantiate(Object oldInstance, Encoder out)
返回值为oldInstance
的表达式。 此方法用于表征应该用于创建给定对象的构造函数或工厂方法。 例如,字段
类的持久委托的instantiate
方法可以定义如下:Field f = (Field)oldInstance; return new Expression(f, f.getDeclaringClass(), "getField", new Object[]{f.getName()});
请注意,我们声明返回表达式的值,以便表达式的值(由getValue
返回)与oldInstance
相同。- 参数
-
oldInstance
- 将由此表达式创建的实例。 -
out
- 将写入此表达式的流。 - 结果
-
表达式,其值为
oldInstance
。 - 异常
-
NullPointerException
- 如果out
是null
并且该值在方法中使用
-
initialize
protected void initialize(类<?> type, Object oldInstance, Object newInstance, Encoder out)
在newInstance
上生成一系列带副作用的语句,以便新实例等效于oldInstance
。 在此方法的规范中,我们的意思是等效,在方法返回后,修改后的实例在其公共API中的所有方法的行为中与newInstance
无法区分。实施通常通过产生涉及
oldInstance
及其公开可用状态的一系列“发生了什么”语句来实现此目标。 这些语句使用其writeExpression
方法发送到输出流,该方法返回一个表达式,该表达式涉及克隆环境中的元素,模拟读取期间输入流的状态。 返回的每个语句都将旧环境的所有实例替换为新环境中存在的对象。 特别是,这些声明,这开始作为引用的目标引用oldInstance
返回来引用newInstance
代替。 执行这些语句会影响两个对象状态的增量对齐,作为对新环境中对象的一系列修改。 当initialize方法返回时,应该不可能通过使用它们的公共API来区分这两个实例。 最重要的是,用于使这些对象看起来等效的步骤序列将由输出流记录,并在刷新流时形成实际输出。默认实现,调用类型的超类的
initialize
方法。- 参数
-
type
- 实例的类型 -
oldInstance
- 要复制的实例。 -
newInstance
- 要修改的实例。 -
out
- 应写入任何初始化语句的流。 - 异常
-
NullPointerException
- 如果out
是null
-
-