Spec-Zone .ru
спецификации, руководства, описания, API
|
Следующее является улучшениями к сериализации до Java™ SE Комплект разработчика 6 (JDK). Для улучшений в текущем выпуске см. Изменения Сериализации и Улучшения в Java Комплект разработчика 6 SE.
Enum.valueOf
метод вызывают с тем классом и полученным постоянным именем, чтобы получить перечислимую константу, чтобы возвратиться.ClassNotFoundException
брошенный ObjectInputStream.readClassDescriptor
метод был бы отражен к высокоуровневой вызывающей стороне ObjectInputStream.readObject
как a StreamCorruptedException
с пустой причиной. Это теперь отражается к высокоуровневой вызывающей стороне как InvalidClassException
с оригиналом ClassNotFoundException
как причина.ObjectStreamClass.lookup
метод мог мертвая блокировка если вызвано изнутри статического инициализатора класса, представленного методом Class
параметр. Мертвая блокировка больше не должна произойти в этом случае.Serializable
интерфейс был расширен, чтобы более полностью определить роль и использование serialVersionUID
s, и подчеркнуть потребность определить явный serialVersionUID
s для сериализуемых классов.Эти API могут использоваться, чтобы более эффективно считать содержавшие объекты массива безопасным способом; для получения дополнительной информации см. раздел 6 Спецификации Сериализации Объекта Java, "Охраняя Неразделенные Десериализованные Объекты".
Также начиная с J2SE 1.4.0, общедоступный конструктор ObjectInputStream с одним параметром требует "enableSubclassImplementation" SerializablePermission когда вызвано (любой прямо или косвенно) подклассом, который переопределяет ObjectInputStream.readFields или ObjectInputStream.readUnshared.
Эти изменения не будут влиять на значительное большинство приложений. Однако, это будет влиять на любые подклассы ObjectInputStream/ObjectOutputStream, которые переопределяют методы putFields ИЛИ readFields, также не переопределяя остальную часть инфраструктуры сериализации.
private void readObjectNoData() throws ObjectStreamException;Метод readObjectNoData() походит на определенный с помощью класса метод readObject(), за исключением того, что (если определено) это вызывают в случаях, где дескриптор класса для суперкласса десериализовываемого объекта (и следовательно объектные данные, описанные тем дескриптором класса), не присутствует в потоке сериализации. Более формально: Если объект O класса C десериализовывается, и S является суперклассом C в VM, который десериализовывает O, то S.readObjectNoData() вызывается ObjectInputStream во время десериализации O, если и только если следующие условия являются истиной:
См. описание класса в спецификации API ObjectInputStream для получения дополнительной информации.
java.io.UTFDataFormatException
брошенный. В 1.3, протокол сериализации был улучшен, чтобы позволить строкам дольше чем 64 K быть сериализированными. Отметьте, что, если 1.2 (или ранее) JVM пытается считать длинную строку, записанную из совместимой с 1.3 JVM, 1.2 (или ранее) JVM получит a java.io.StreamCorruptedException
.java.lang.ClassNotFoundException
бросается вместо универсального так, чтобы больше информации об отказе было доступно. Кроме того, исключение десериализации, сообщающее теперь, включает поддержание имени исходного класса, который не мог быть найден вместо того, чтобы сообщить о высокоуровневом классе, который десериализовывался. Например, если (в вызове RMI) тупиковый класс может быть найден, но удаленный интерфейсный класс не может, механизм сериализации теперь сообщить правильно, что интерфейсный класс был классом, который не мог быть найден вместо того, чтобы ошибочно сообщить, что тупиковый класс не мог быть найден.java.io.ObjectOutputStream.writeClassDescriptor
,java.io.ObjectInputStream.readClassDescriptor
(начиная с 1.3)writeClassDescriptor
и readClassDescriptor
методы были добавлены, чтобы обеспечить средство настройки сериализированного представления java.io.ObjectStreamClass
дескрипторы класса. writeClassDescriptor
вызывается когда экземпляр java.io.ObjectStreamClass
потребности, которые будут сериализированы, и, ответственны за запись ObjectStreamClass
к потоку сериализации. Наоборот, readClassDescriptor
вызывается когда ObjectInputStream
ожидает ObjectStreamClass
экземпляр как следующий элемент в потоке сериализации. Переопределяя эти методы, подклассы ObjectOutputStream
и ObjectInputStream
может передать дескрипторы класса в специализированном формате. Для получения дополнительной информации обратитесь к разделам 2.1 и 3.1 из Спецификации Сериализации Объекта Java.java.io.ObjectOutputStream.annotateProxyClass
,java.io.ObjectInputStream.resolveProxyClass
(начиная с 1.3)ObjectOutputStream.annotateClass
и ObjectInputStream.resolveClass
, за исключением того, что они применяются к динамическим прокси-классам (см. java.lang.reflect.Proxy
), в противоположность непрокси-классам. Подклассы ObjectOutputStream
может переопределить annotateProxyClass
хранить пользовательские данные в потоке наряду с дескрипторами для динамических прокси-классов. ObjectInputStream
подклассы могут тогда переопределить resolveProxyClass
использовать пользовательские данные в выборе локального класса, чтобы связаться с данным дескриптором прокси-класса. Для получения дополнительной информации см. раздел 4 из Спецификации Сериализации Объекта Java.@serial
, @serialField
, и @serialData
(начиная с 1.2)@serial
, @serialField
, и @serialData
были добавлены, чтобы обеспечить способ задокументировать сериализированную форму класса. Javadoc генерирует спецификацию сериализации, основанную на содержании этих тегов. Для получения дополнительной информации отнеситесь, чтобы разделить 1.6 из Спецификации Сериализации Объекта Java.java.io.Externalizable
взаимодействуйте через интерфейс, если классы для тех объектов не были доступны. В 1.2, была добавлена новая версия протокола, который адресовал этот недостаток. Для назад совместимости, ObjectOutputStream
и ObjectInputStream
может считать и записать потоки сериализации, записанные в любом протоколе; используемая версия протокола может быть выбрана, вызывая ObjectOutputStream.useProtocolVersion
метод. Для получения дополнительной информации и обсуждение проблем совместимости, см. раздел 6.3 из Спецификации Сериализации Объекта Java.writeReplace
и readResolve
методы (начиная с 1.2)writeReplace
и readResolve
методы, которые позволяют экземплярам данных классов назначать замены на себя во время сериализации и десериализации. Необходимые подписи этих методов, наряду с более подробной информацией, описываются в разделах 2.5 и 3.6 из Спецификации Сериализации Объекта Java.java.io.ObjectOutputStream.writeObjectOverride
, java.io.ObjectInputStream.readObjectOverride
(начиная с 1.2)ObjectOutputStream
и ObjectInputStream
может реализовать пользовательский протокол сериализации, переопределяя writeObjectOverride
и readObjectOverride
методы. Отметьте, что эти методы только вызовут если ObjectOutputStream/ObjectInputStream
подклассы обладают разрешением java.io.SerializablePermission("enableSubclassImplementation")
, и вызовите конструкторов без параметров ObjectOutputStream/ObjectInputStream
. См. разделы 2.1 и 3.1 из Спецификации Сериализации Объекта Java для получения дополнительной информации.ObjectOutputStream
и ObjectInputStream
может переопределить наследованные методы, чтобы получить "рычаги" в определенные аспекты процесса сериализации. С тех пор 1.2, объектная сериализация использует 1.2 модели обеспечения безопасности, чтобы проверить, что подклассы обладают соответствующими полномочиями, чтобы переопределить определенные рычаги. Полномочия java.io.SerializablePermission("enableSubclassImplementation
") и java.io.SerializablePermission("enableSubstitution
"), управляют действительно ли методы ObjectOutputStream.writeObjectOverride
, ObjectOutputStream.replaceObject
, ObjectInputStream.readObjectOverride
, и ObjectInputStream.resolveObject
будет вызван в течение сериализации. См. разделы 2.1 и 3.1 из Спецификаций Сериализации Объекта Java для получения дополнительной информации.serialPersistentFields
, сериализуемые классы могут продиктовать, какие поля будут записаны, когда экземпляры класса (или подклассы) будут сериализированы. Эта опция также позволяет классам "определить" сериализуемые поля, которые не соответствуют непосредственно фактическим полям в классе. Используемый в соединении с сериализуемым полевым API (описанный ниже), эта возможность позволяет полям быть добавленными или удаленными из класса, не изменяя сериализированное представление класса. См. разделы 1.5 и 1.7 из Спецификации Сериализации Объекта Java для деталей.writeObject
/readObject
методы, чтобы явно установить и получают сериализуемые значения полей по имени и тип. Этот API особенно полезен для классов, которые должны поддержать назад совместимость с более старыми версиями класса; в некоторых случаях более старая версия класса, возможно, определила ряд сериализуемых полей, которые не могут быть отображены непосредственно на поля текущего класса. В этом случае более новые версии класса могут определить пользовательский writeObject
и readObject
методы, которые преобразовывают внутреннее состояние приведенного примера (нового) класса в "старую" сериализированную форму, и наоборот. Для получения дополнительной информации см. раздел 1.7 из Спецификации Сериализации Объекта Java.