模块  java.desktop
软件包  java.beans

Class PersistenceDelegate

  • 已知直接子类:
    DefaultPersistenceDelegate

    public abstract class PersistenceDelegate
    extends Object
    PersistenceDelegate类负责根据类的公共API中的方法表达给定类的实例的状态。 相反关联的持久性与类本身完成,例如,由责任readObjectwriteObject由所使用的方法ObjectOutputStream ,溪流如XMLEncoder其中使用该代理模型可以有自己的行为独立控制的类本身。 通常,该类是放置此类信息的最佳位置,并且可以在此委派方案中轻松表达惯例以实现此目的。 然而,有时候,单个类中的一个小问题会阻止编写整个对象图,这可能使应用程序开发人员无法求助,而是尝试在本地隐藏有问题的类或使用替代的持久性技术。 在这种情况下,委托模型为应用程序开发人员提供了一个相对干净的机制,可以干预序列化过程的所有部分,而不需要对不属于应用程序本身的类的实现进行修改。

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

    持久性委托可以控制对象持久性的所有方面,包括:

    • 确定实例是否可以变异为同一个类的另一个实例。
    • 通过调用公共构造函数或公共工厂方法来实例化对象。
    • 执行对象的初始化。
    从以下版本开始:
    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 - 要修改的实例。
        结果
        真要是的等效副本 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 - 如果 outnull并且该值在方法中使用
      • 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 - 如果 outnull