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