Spec-Zone .ru
спецификации, руководства, описания, API
|
public interface Serializable
Чтобы позволить подтипам несериализуемых классов быть сериализированными, подтип может принять на себя ответственность за сохранение и восстановление состояния общественности супертипа, защищенной, и (если доступный) поля пакета. Подтип может принять на себя эту ответственность, только если у class, который это расширяет, есть доступный конструктор без аргументов, чтобы инициализировать состояние class. Это - ошибка объявить class, Сериализуемый если дело обстоит не так. Ошибка будет обнаружена во времени выполнения.
Во время десериализации поля несериализуемых классов будут инициализированы, используя общественность или защищали конструктора без аргументов class. Конструктор без аргументов должен быть доступным для подкласса, который сериализуем. Поля сериализуемых подклассов будут восстановлены от потока.
Пересекая график, с объектом можно встретиться, который не поддерживает Сериализуемый интерфейс. В этом случае NotSerializableException будет брошен и идентифицирует class несериализуемого объекта.
Классы, которые требуют специальной обработки во время сериализации и процесса десериализации, должны реализовать специальные методы с этими точными подписями:
private void writeObject(java.io.ObjectOutputStream out) throws IOException private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException; private void readObjectNoData() throws ObjectStreamException;
writeObject метод ответственен за запись состояния объекта для его определенного class так, чтобы соответствующий readObject метод мог восстановить это. Механизм значения по умолчанию для того, чтобы сохранить поля Объекта может быть вызван, вызывая out.defaultWriteObject. Метод не должен интересоваться состоянием, принадлежащим его суперклассам или подклассам. Государство сохраняется при записи отдельных полей в ObjectOutputStream, используя writeObject метод или при использовании методов для примитивных типов данных, поддерживаемых DataOutput.
readObject метод ответственен за то, что читал из потока и восстановил поля классов. Это может вызвать in.defaultReadObject, чтобы вызвать механизм значения по умолчанию для того, чтобы восстановить нестатические и непереходные поля объекта. defaultReadObject метод использует информацию в потоке, чтобы присвоить поля объекта, сохраненного в потоке с соответственно именованными полями в текущем объекте. Это обрабатывает случай, когда class развился, чтобы добавить новые поля. Метод не должен интересоваться состоянием, принадлежащим его суперклассам или подклассам. Государство сохраняется при записи отдельных полей в ObjectOutputStream, используя writeObject метод или при использовании методов для примитивных типов данных, поддерживаемых DataOutput.
readObjectNoData метод ответственен за инициализацию состояния объекта для его определенного class, когда поток сериализации не перечисляет данный class как суперкласс десериализовываемого объекта. Это может произойти в случаях, где принимающая сторона использует различную версию class десериализованного экземпляра чем передающая сторона, и версия получателя расширяет классы, которые не расширяются версией отправителя. Это может также произойти, если поток сериализации вмешался; следовательно, readObjectNoData полезен для инициализации десериализованных объектов должным образом несмотря на "враждебный" или неполный исходный поток.
Сериализуемые классы, которые должны определять альтернативный объект использоваться при записи объекта в поток, должны реализовать этот специальный метод с точной подписью:
ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;
Этот writeReplace метод вызывается сериализацией, если бы метод существует, и это было бы доступно от метода, определенного в пределах class сериализируемого объекта. Таким образом у метода может быть частный, защищенный и частный на пакет доступ. Доступ подкласса к этому методу следует за правилами доступности java.
Классы, которые должны определять замену, когда экземпляр ее читается из потока, должны реализовать этот специальный метод с точной подписью.
ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
Этот readResolve метод следует за теми же самыми правилами вызова и правилами доступности как writeReplace.
Время выполнения сериализации связывает с каждым сериализуемым class номер версии, названный serialVersionUID, который используется во время десериализации, чтобы проверить, что отправитель и получатель сериализированного объекта загрузили классы для того объекта, которые являются совместимыми относительно сериализации. Если получатель загрузил class для объекта, у которого есть различный serialVersionUID чем тот из class соответствующего отправителя, то десериализация приведет к InvalidClassException
. Сериализуемый class может объявить свой собственный serialVersionUID явно, объявляя названное поле "serialVersionUID"
это должно быть статичным, заключительным, и типа long
:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;Если сериализуемый class явно не объявит serialVersionUID, то время выполнения сериализации вычислит значение по умолчанию serialVersionUID значение для что class, основанный на различных аспектах class, как описано в Java (ТМ) Спецификация Сериализации Объекта. Однако, строго рекомендуется, чтобы все сериализуемые классы явно объявили значения serialVersionUID, так как значение по умолчанию serialVersionUID вычисление очень чувствительно к деталям class, которые могут измениться в зависимости от реализаций компилятора, и могут таким образом привести к неожиданному
InvalidClassException
s во время десериализации. Поэтому, чтобы гарантировать непротиворечивое значение serialVersionUID через различные реализации компилятора java, сериализуемый class должен объявить явное значение serialVersionUID. Также строго советуют, что явные serialVersionUID объявления используют private
модификатор где только возможно, так как такие объявления применяются только к непосредственному объявлению, что class - serialVersionUID поля не полезен как наследованные элементы. Классы массива не могут объявить явный serialVersionUID, таким образом, у них всегда есть значение по умолчанию, от вычисленного значения, но требования для того, чтобы соответствовать значения serialVersionUID отклоняют для классов массива.ObjectOutputStream
, ObjectInputStream
, ObjectOutput
, ObjectInput
, Externalizable
Для дальнейшей ссылки API и документации разработчика, см. Java Документация SE. Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2013, Oracle и/или его филиалы. Все права защищены.
Проект сборка-b92