java.lang.Object java.beans.PersistenceDelegate
public abstract class PersistenceDelegate
PersistenceDelegate 类负责根据类的公共 API 中的方法表示给定类的实例状态。不是根据它完成时的样子,通过(例如)ObjectOutputStream
使用的 readObject
和 writeObject
方法,将持久存储的责任与类本身关联起来,而是让使用此委托模型的类似 XMLEncoder
的流可以拥有不依赖于类本身控制的自己的行为。通常,该类是放置信息的最佳地方,它可以很容易地在此委托方案中表示约定,以完成操作。不过有时会出现这样的情况,单个类中的一个很小的问题阻止了整个对象图形的写入,这可能会使得应用程序开发人员毫无办法,只有试图局部隐藏有问题的类,或使用替代的持久存储技巧。在这种情况下,委托模型提供了一个相关的清理机制,使应用程序开发人员干涉序列化过程的所有部分,不需要对不是应用程序本身一部分的类的实现进行修改。
除了使用委托模型,此持久方案不同于传统序列化方案的地方在于,它需要 writeObject
方法的仿真,而不需要相应的 readObject
方法。根据此公共 API,writeObject
仿真对每个实例编码,并且不需要定义 readObject
仿真,因为读取序列化格式的过程由方法调用的语义定义,正如 Java Language Specification 中展示的那样。打破 writeObject
与 readObject
实现之前的依赖关系,这可能会改变版本,因此它是使此技术产生的档案不受它们所参考类的私有实现更改影响的关键。
持久委托可以控制对象持久性的所有方面,其中包括:
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 |
构造方法详细信息 |
---|
public PersistenceDelegate()
方法详细信息 |
---|
public void writeObject(Object oldInstance, Encoder out)
writeObject
是持久性的一个入口点,由传统委托模式中的
Encoder
使用。尽管此方法不是最终方法,但在普通环境下不必为其创建子类。
此实现首先检查流是否已经遇到此对象。接着调用 mutatesTo
方法查看是否可以将从流中返回的候选者转变成 oldInstance
的精确副本。如果可以,则调用 initialize
方法执行初始化。如果不可以,则从流中移除该候选者,并调用 instantiate
方法为此对象创建一个新候选者。
oldInstance
- 将由此表达式创建的实例。
out
- 将在其中写入此表达式的流。
protected boolean mutatesTo(Object oldInstance, Object newInstance)
oldInstance
的
等效 副本可以可以通过应用
newInstance
的一系列语句来创建,则返回 true。在此方法的规范中,等效是指修改后的实例其公共 API 中相关方法的行为与
oldInstance
没有区别。[注:在这里使用短语
相关 方法而不是使用
所有 方法只是因为,为了保证完全正确,类似
hashCode
和
toString
这样的方法阻止大多数类实际产生其实例的无区别副本]。
如果两个实例的类是相同的,则默认行为返回 true
。
oldInstance
- 要复制的实例。
newInstance
- 要修改的实例。
oldInstance
进行一系列的修改能够创建
newInstance
的等效副本,则返回 true。
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
的表达式。
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
- 保存所有应该写入的初始化语句的流。