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