Module  java.desktop
软件包  java.beans

Class PersistenceDelegate

  • 已知直接子类:
    DefaultPersistenceDelegate


    public abstract class PersistenceDelegate
    extends Object
    PersistenceDelegate类负责根据类的公共API中的方法来表达给定类的实例的状态。 相反关联的持久性与类本身完成,例如,由责任readObjectwriteObject由所使用的方法ObjectOutputStream ,溪流像XMLEncoder即采用这种委托模型可以有自己的行为独立控制的类本身。 通常来说,这个班级是在这个授权计划中可以很容易地表达这些信息和惯例的最佳方法。 然而,有时候,单个类中的一个小问题可以防止整个对象图形被写入,并且这可以使应用程序开发人员无需追索权,而是尝试在本地影响有问题的类或使用替代的持久性技术。 在这种情况下,授权模型给应用程序开发人员提供了相对干净的机制来干预序列化过程的所有部分,而不需要对不是应用程序本身的一部分的类的实现进行修改。

    除了使用委托模型之外,该持久性方案与传统的串行化方案不同,需要不具有对应的readObject方法的writeObject方法的模拟。 writeObject模拟器根据其公共API编码每个实例,并且不需要定义readObject模拟,因为用于读取序列化表单的过程由Java语言规范中所阐述的方法调用的语义定义。 打破writeObjectreadObject之间的依赖关系,这可能会从版本更改为版本,这是通过此技术生成的归档不受其引用的类的私有实现的变化的关键因素。

    持久代理可以控制对象持久化的所有方面,包括:

    • 决定一个实例是否可以被突变成同一个类的另一个实例。
    • 通过调用公共构造函数或公共工厂方法来实例化对象。
    • 执行对象的初始化。
    从以下版本开始:
    1.4
    另请参见:
    XMLEncoder
    • 构造方法详细信息

      • PersistenceDelegate

        public PersistenceDelegate​()
    • 方法详细信息

      • writeObject

        public void writeObject​(Object oldInstance,
                                Encoder out)
        writeObject是持久性的单个入口点,由传统的授权模式中的Encoder使用。 虽然这种方法不是最终的,但在正常情况下不需要进行子类化。

        这个实现首先检查流是否已经遇到这个对象。 接下来, mutatesTo方法来查看从流返回的候选人是否可以突变为oldInstance的准确副本。 如果可以,则调用initialize方法来执行初始化。 如果没有,候选人将从流中删除,并调用instantiate方法为此对象创建新的候选项。

        参数
        oldInstance - 将由此表达式创建的实例。
        out - 将写入此表达式的流。
        异常
        NullPointerException - 如果 outnull
      • mutatesTo

        protected boolean mutatesTo​(Object oldInstance,
                                    Object newInstance)
        如果通过将一系列语句应用于newInstance可以创建oldInstance等效副本,则返回true。 在这种方法的规范中,我们的意思是相当于修改的实例与其公共API中相关方法的行为不符合oldInstance [注意:我们使用短语相关方法而不是所有方法,因为这是严格正确的,像hashCodetoString这样的方法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 - 如果 outnull并且该值用于该方法
      • 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 - 如果 outnull