Spec-Zone .ru
спецификации, руководства, описания, API
|
public abstract class PersistenceDelegate extends Object
readObject
и writeObject
методы, используемые ObjectOutputStream
, потоки как XMLEncoder
тому, которые используют эту модель делегации, можно было управлять их поведением независимо от классов непосредственно. Обычно, класс является лучшим местом, чтобы поместить такую информацию, и соглашения могут легко быть выражены в этой схеме делегации сделать только это. Иногда однако это имеет место, что незначительная проблема в едином классе препятствует тому, чтобы весь граф объектов был записан, и это может оставить разработчика приложений без обращения за помощью, но делать попытку к тени проблематичных классов локально или использовать альтернативные методы персистентности. В ситуациях как они модель делегации дает относительно чистый механизм для разработчика приложений, чтобы вмешаться во все части процесса сериализации, не требуя, что модификации быть сделанным к реализации классов, которые не являются частью приложения непосредственно. В дополнение к использованию модели делегации эта схема персистентности отличается от традиционных схем сериализации в требовании аналога writeObject
метод без соответствия readObject
метод. writeObject
аналог кодирует каждый экземпляр с точки зрения своего общедоступного API и нет никакой потребности определить a readObject
аналог начиная с процедуры для того, чтобы считать сериализированную форму определяется семантикой вызова метода как размечено в Спецификации языка Java. Повреждение зависимости между 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)
Возвращает true если эквивалентная копия
oldInstance может быть создан, применяя серию операторов к newInstance . |
void |
writeObject(Object oldInstance, Encoder out)
writeObject единственная точка входа к персистентности и используется a Encoder в традиционном режиме делегации. |
public void writeObject(Object oldInstance, Encoder out)
writeObject
единственная точка входа к персистентности и используется a Encoder
в традиционном режиме делегации. Хотя этот метод не является заключительным, он не должен должен быть быть разделено на подклассы при нормальных обстоятельствах. Эта реализация сначала проверяет, чтобы видеть, встретился ли поток уже с этим объектом. Затем mutatesTo
метод вызывают, чтобы видеть, может ли тот кандидат, возвращенный из потока, быть видоизменен в точную копию oldInstance
. Если это может, initialize
метод вызывают, чтобы выполнить инициализацию. В противном случае кандидат удаляется из потока, и instantiate
метод вызывают, чтобы создать нового кандидата на этот объект.
oldInstance
- Экземпляр, который будет создаваться этим выражением.out
- Поток, которому будет записано это выражение.NullPointerException
- если out
null
protected boolean mutatesTo(Object oldInstance, Object newInstance)
oldInstance
может быть создан, применяя серию операторов к newInstance
. В спецификации этого метода мы подразумеваем эквивалентный, от которого измененный экземпляр неотличим oldInstance
в поведении соответствующих методов в его общедоступном API. [Отметьте: мы используем фразу соответствующие методы, а не все методы здесь только потому, что, чтобы быть строго корректными, методы как 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
- Экземпляр, который будет создаваться этим выражением.out
- Поток, которому будет записано это выражение.oldInstance
.NullPointerException
- если out
null
protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder out)
newInstance
так, чтобы новый экземпляр стал эквивалентным oldInstance
. В спецификации этого метода мы подразумеваем эквивалентный, от которого после возвратов метода измененный экземпляр неотличим newInstance
в поведении всех методов в его общедоступном API. Реализация обычно достигает этой цели, производя серию, "что произошло" операторы, включающие oldInstance
и его публично доступное состояние. Эти операторы отправляются потоку вывода, используя writeExpression
метод, который возвращает выражение, включающее элементы в клонированную среду, моделирующую состояние входного потока во время чтения. У каждого возвращенного оператора будут все экземпляры старая среда, замененная объектами, которые существуют в новом. В частности ссылки на цель этих операторов, которые начинаются как ссылки на oldInstance
возвращаются как ссылки на newInstance
вместо этого. Выполнение этих операторов производит инкрементное выравнивание состояния двух объектов как ряд модификаций к объектам в новой среде. К этому времени инициализировать возвраты метода должно быть невозможно сказать эти два экземпляра обособленно при использовании их общедоступных API. Что наиболее важно последовательность шагов, которые использовались, чтобы заставить эти объекты казаться эквивалентными, будет записана потоком вывода и сформирует фактический вывод, когда поток будет сброшен.
Реализация по умолчанию, вызовы initialize
метод суперкласса типа.
oldInstance
- Экземпляр, который будет скопирован.newInstance
- Экземпляр, который должен быть изменен.out
- Поток, которому должны быть записаны любые операторы инициализации.NullPointerException
- если out
null
Для дальнейшей ссылки API и документации разработчика, см.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.