Spec-Zone.ru › OpenJDK 24

Класс PersistenceDelegate

java.lang.Object
java.beans.PersistenceDelegate
Прямые известные подклассы:
DefaultPersistenceDelegate
public abstract class PersistenceDelegate extends Object
Класс PersistenceDelegate берёт на себя ответственность за выражение состояния экземпляра данного класса в терминах методов публичного API класса. Вместо того, чтобы связывать ответственность за сохранение с самим классом, как это делается, например, методами readObject и writeObject, используемыми потоками, такими как ObjectOutputStream, потоки, подобные XMLEncoder, которые используют эту модель делегирования, могут иметь своё поведение, управляемое независимо от самих классов. Обычно, класс является лучшим местом для такой информации, и соглашения могут быть легко выражены в этой схеме делегирования, чтобы сделать именно это. Иногда, однако, возникает проблема, когда незначительная проблема в одном классе препятствует записи всего графа объектов, и это может оставить разработчика приложения без возможности, кроме как попытаться затенить проблемные классы локально или использовать альтернативные методы сохранения. В таких ситуациях модель делегирования предоставляет относительно чистый механизм для разработчика приложения вмешиваться во все аспекты процесса сериализации без необходимости внесения изменений в реализацию классов, которые не являются частью самого приложения.

В дополнение к использованию модели делегирования, эта схема сохранения отличается от традиционных схем сериализации тем, что требует аналога метода writeObject без соответствующего метода readObject. Аналог метода writeObject кодирует каждый экземпляр в терминах его публичного API, и нет необходимости определять аналог метода readObject, так как процедура чтения сериализованной формы определяется семантикой вызова метода, как определено в спецификации языка Java. Разрыв зависимости между реализациями writeObject и readObject, которые могут меняться от версии к версии, является ключевым фактором, делающим архивы, созданные этим методом, невосприимчивыми к изменениям в частных реализациях классов, на которые они ссылаются.

Делегат сохранения может контролировать все аспекты сохранения объекта, включая:

  • Решение о том, может ли экземпляр быть изменён в другой экземпляр того же класса.
  • Создание объекта, вызывая публичный конструктор или публичный фабричный метод.
  • Выполнение инициализации объекта.
Since:
1.4
См. также:
  • XMLEncoder

Краткое описание конструкторов

PersistenceDelegate()
Модификатор Конструктор Описание
protected
Создаёт 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)
Возвращает true, если эквивалентная копия oldInstance может быть создана путём применения ряда операторов к newInstance.
void writeObject(Object oldInstance, Encoder out)
writeObject является единственной точкой входа в сохранение и используется Encoder в традиционном режиме делегирования.

Методы, унаследованные от класса java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание конструкторов

PersistenceDelegate

protected PersistenceDelegate()
Создаёт PersistenceDelegate.

Подробное описание методов

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)
Возвращает true, если эквивалентная копия oldInstance может быть создана путём применения ряда операторов к newInstance. В спецификации этого метода под эквивалентностью понимается, что изменённый экземпляр неотличим от oldInstance по поведению соответствующих методов его публичного API. [Примечание: мы используем фразу «соответствующие» методы вместо «всех» методов только потому, что для строгой корректности методы, такие как hashCode и toString, предотвращают создание действительно неотличимых копий экземпляров большинства классов].

По умолчанию метод возвращает true, если классы двух экземпляров совпадают.

Параметры:
oldInstance - экземпляр, подлежащий копированию.
newInstance - экземпляр, который должен быть изменён.
Возвращает:
True, если эквивалентная копия newInstance может быть создана путём применения серии изменений к oldInstance.

instantiate

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 - экземпляр, который будет создан этим выражением.
out - поток, в который будет записано это выражение.
Возвращает:
Выражение, значение которого равно oldInstance.
Исключения:
NullPointerException - если out является null и это значение используется в методе

initialize

protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder out)
Создаёт серию операторов со побочными эффектами на newInstance, чтобы новый экземпляр стал эквивалентным oldInstance. В спецификации этого метода под эквивалентностью понимается, что после возврата метода изменённый экземпляр неотличим от newInstance по поведению всех методов его публичного API.

Реализация обычно достигает этой цели, создавая серию операторов «что произошло» с участием oldInstance и его публично доступного состояния. Эти операторы отправляются в выходной поток с помощью метода writeExpression, который возвращает выражение, включающее элементы в клонированной среде, имитирующей состояние входного потока во время чтения. Каждый возвращённый оператор будет содержать все экземпляры старой среды, заменённые объектами, существующими в новой. В частности, ссылки на цель этих операторов, которые изначально являются ссылками на oldInstance, возвращаются как ссылки на newInstance вместо этого. Выполнение этих операторов приводит к постепенному выравниванию состояния двух объектов в виде серии изменений в объектах новой среды. К моменту возврата метода initialize два экземпляра должны стать неразличимыми с использованием их публичных API. Важно, что последовательность шагов, использованных для достижения эквивалентности этих объектов, будет записана в выходной поток и будет составлять фактический вывод при сбросе потока.

Реализация по умолчанию вызывает метод initialize типа суперкласса.

Параметры:
type - тип экземпляров
oldInstance - экземпляр, подлежащий копированию.
newInstance - экземпляр, который должен быть изменён.
out - поток, в который должны быть записаны операторы инициализации.
Исключения:
NullPointerException - если out является null

© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://download.java.net/java/early_access/jdk24/docs/api/java.desktop/java/beans/PersistenceDelegate.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API