- java.lang.Object
-
- java.beans.PersistenceDelegate
-
- 已知直接子类:
-
DefaultPersistenceDelegate
public abstract class PersistenceDelegate extends Object
PersistenceDelegate类负责根据类的公共API中的方法来表达给定类的实例的状态。 相反关联的持久性与类本身完成,例如,由责任readObject
种writeObject
由所使用的方法ObjectOutputStream
,溪流像XMLEncoder
即采用这种委托模型可以有自己的行为独立控制的类本身。 通常来说,这个班级是在这个授权计划中可以很容易地表达这些信息和惯例的最佳方法。 然而,有时候,单个类中的一个小问题可以防止整个对象图形被写入,并且这可以使应用程序开发人员无需追索权,而是尝试在本地影响有问题的类或使用替代的持久性技术。 在这种情况下,授权模型给应用程序开发人员提供了相对干净的机制来干预序列化过程的所有部分,而不需要对不是应用程序本身的一部分的类的实现进行修改。除了使用委托模型之外,该持久性方案与传统的串行化方案不同,需要不具有对应的
readObject
方法的writeObject
方法的模拟。writeObject
模拟器根据其公共API编码每个实例,并且不需要定义readObject
模拟,因为用于读取序列化表单的过程由Java语言规范中所阐述的方法调用的语义定义。 打破writeObject
和readObject
之间的依赖关系,这可能会从版本更改为版本,这是通过此技术生成的归档不受其引用的类的私有实现的变化的关键因素。持久代理可以控制对象持久化的所有方面,包括:
- 决定一个实例是否可以被突变成同一个类的另一个实例。
- 通过调用公共构造函数或公共工厂方法来实例化对象。
- 执行对象的初始化。
- 从以下版本开始:
- 1.4
- 另请参见:
-
XMLEncoder
-
-
构造方法摘要
构造方法 Constructor 描述 PersistenceDelegate()
-
方法摘要
所有方法 接口方法 抽象方法 具体的方法 Modifier and Type 方法 描述 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)
如果通过将一系列语句应用于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
- 要修改的实例。 - 结果
-
如果通过将一系列突变应用于
oldInstance
可以创建newInstance
的等效副本,newInstance
oldInstance
。
-
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
的表达式。 - 异常
-
NullPointerException
- 如果out
是null
并且该值用于该方法
-
initialize
protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder out)
对newInstance
生成一系列具有副作用的语句,以使新实例变为等效于oldInstance
。 在这种方法的规范中,我们的意思是相当于在方法返回之后,修改的实例与其公共API中所有方法的行为不newInstance
。实施通常通过产生一系列涉及
oldInstance
及其公开可用状态的“发生了什么”的声明来实现这一目标。 这些语句使用其writeExpression
方法发送到输出流,该方法返回一个涉及在阅读期间模拟输入流状态的克隆环境中的元素的表达式。 返回的每个语句都将使旧环境中的所有实例都替换为新对象。 特别是,这些声明,这开始了作为参考的对象引用oldInstance
返回来引用newInstance
代替。 执行这些语句会对两个对象的状态进行增量对齐,这是对新环境中对象的一系列修改。 在初始化方法返回之前,应该不可能通过使用它们的公共API来将两个实例分开。 最重要的是,用于使这些对象看起来是等效的步骤序列将被输出流记录,并且当流被刷新时将形成实际的输出。默认实现,调用类型的超类的
initialize
方法。- 参数
-
type
- 实例的类型 -
oldInstance
- 要复制的实例。 -
newInstance
- 要修改的实例。 -
out
- 应写入任何初始化语句的流。 - 异常
-
NullPointerException
- 如果out
是null
-
-