Spec-Zone .ru
спецификации, руководства, описания, API
|
СОДЕРЖАНИЕ | ПРЕДЫДУЩИЙ | NEXT | Спецификация Сериализации Объекта Java версия 6.0 |
ГЛАВА 4 |
ObjectStreamClass
предоставляет информацию о классах, которые сохраняются в потоке Сериализации. Дескриптор обеспечивает полностью определенное имя class и его UID версии сериализации. A SerialVersionUID
идентифицирует уникальную исходную версию class, для которой этот class способен к записи потоков и из которого это может читать.
package java.io; public class ObjectStreamClass { public static ObjectStreamClass lookup(Class cl); public static ObjectStreamClass lookupAny(Class cl); public String getName(); public Class forClass(); public ObjectStreamField[] getFields(); public long getSerialVersionUID(); public String toString(); }
lookup
метод возвращается ObjectStreamClass
дескриптор для указанного class в виртуальной машине. Если class определил serialVersionUID
это получается от class. Если serialVersionUID
не определяется class, он вычисляется из определения class в виртуальной машине. Если указанный class не сериализуем или externalizable, нуль возвращается. lookupAny
метод ведет себя как lookup
метод, за исключением того, что это возвращает дескриптор для любого class, независимо от того, реализует ли это Serializable
. serialVersionUID
из class, который не реализует Serializable
0L.
getName
метод возвращает имя class в том же самом формате, который используется Class.getName
метод.
forClass
метод возвращается Class
в локальной виртуальной машине, если Вы были найдены ObjectInputStream.resolveClass
метод. Иначе, это возвращает нуль.
getFields
метод возвращает массив ObjectStreamField
объекты, которые представляют сериализуемые поля этого class.
getSerialVersionUID
метод возвращается serialVersionUID
из этого class. Обратитесь к Разделу 4.6, "Потоковые Уникальные идентификаторы." Если не определенный class, возвращенное значение является хешем, вычисленным с имени class, интерфейсов, методов, и полей, используя Безопасный Хеш-алгоритм (SHA) как определено Национальным Институтом Стандартов.
toString
метод возвращает печатаемое представление дескриптора class включая имя class и serialVersionUID
.
Дескрипторы ObjectStreamClass также используются, чтобы предоставить информацию о динамических прокси-классах (например, классы, полученные через звонки в getProxyClass метод java.lang.reflect. Прокси) сохраненный в потоке сериализации. У динамического прокси class нет никаких сериализуемых полей и serialVersionUID 0L. Другими словами, когда у объекта Класса для динамического прокси, class передают к статическому методу поиска ObjectStreamClass, возвращенный экземпляр ObjectStreamClass, будут следующие свойства:
Когда ObjectStreamClass
экземпляр, который не представляет динамический прокси class, пишется потоку, это написало имя class и serialVersionUID
, флаги, и число полей. В зависимости от class может быть записана дополнительная информация:
SC_SERIALIZABLE
ни SC_EXTERNALIZABLE
флаговые биты устанавливаются.SC_SERIALIZABLE
флаг устанавливается, число полей считает число сериализуемых полей и сопровождается дескриптором для каждого сериализуемого поля. Дескрипторы пишутся в каноническом порядке. Дескрипторы для примитивных введенных полей пишутся сначала сортированный именем поля, сопровождаемым дескрипторами для объекта введенные поля, сортированные именем поля. Имена сортируются, используя String.compareTo
. Для получения дополнительной информации формата, обратитесь к Разделу 6.4, "Грамматика для Потокового Формата".SC_EXTERNALIZABLE
флаг, и число полей всегда являются нулем.SC_ENUM
флаг, и число полей всегда являются нулем.Сериализированные представления дескрипторов ObjectStreamClass для динамических прокси-классов и нединамических прокси-классов дифференцируются с помощью различного typecodes (TC_PROXYCLASSDESC и TC_CLASSDESC, соответственно); для более подробной спецификации грамматики см. Раздел 6.4, "Грамматика для Потокового Формата".
ObjectStreamField
представляет сериализуемое поле сериализуемого class. Сериализуемые поля class могут быть получены от ObjectStreamClass
. Специальное статическое сериализуемое поле, serialPersistentFields
, массив ObjectStreamField
компоненты, который используется, чтобы переопределить значение по умолчанию сериализуемые поля.
package java.io; public class ObjectStreamField implements Comparable { public ObjectStreamField(String fieldName, Class fieldType); public ObjectStreamField(String fieldName, Class fieldType, boolean unshared); public String getName(); public Class getType(); public String getTypeString(); public char getTypeCode(); public boolean isPrimitive(); public boolean isUnshared(); public int getOffset(); protected void setOffset(int offset); public int compareTo(Object obj); public String toString(); }
ObjectStreamField
объекты используются, чтобы определить сериализуемые поля class или описать поля, существующие в потоке. Его конструкторы принимают, что параметры, описывающие поле представляют: строка, определяющая имя поля, a Class
объект, определяющий тип поля, и a boolean
флаг (неявно false
для конструктора с двумя параметрами) указание, должны ли значения представленного поля быть считаны и записаны как "неразделенные" объекты, если сериализация/десериализация значения по умолчанию используется (см. описания ObjectInputStream.readUnshared
и ObjectOutputStream.writeUnshared
методы в разделах 3.1 и 2.1, соответственно). getName
метод возвращает имя сериализуемого поля.
getType
метод возвращает тип поля.
getTypeString
метод возвращает подпись типа поля.
getTypeCode
метод возвращает кодировку символов типа поля (`B'
для byte
, `C'
для char
, `D'
для double
, `F'
для float
, `I'
для int
, `J'
для long
, `L'
поскольку немассив возражает типам, `S'
для short
, `Z'
для boolean
, и `[`
для массивов).
isPrimitive
возвраты метода true
если поле имеет тип примитива, или false
иначе.
isUnshared
возвраты метода true
если значения поля должны быть записаны как "неразделенные" объекты, или false
иначе.
getOffset
метод возвращает смещение значения поля в пределах данных экземпляра class, определяющего поле.
setOffset
метод позволяет ObjectStreamField
подклассы, чтобы изменить значение смещения, возвращенное getOffset
метод.
compareTo
метод сравнивается ObjectStreamFields
для использования в сортировке. Примитивные поля оцениваются как "меньшие" чем непримитивные поля; поля, иначе равные, оцениваются в алфавитном порядке.
toString
метод возвращает печатаемое представление с именем и типом.
serialVersionUID
. Когда вызвано с опцией-шоу, это поднимает простой пользовательский интерфейс. Узнать, сериализуем ли class и узнать его serialVersionUID,
введите его полное имя class, затем нажмите или Введение или кнопку Show. Напечатанная строка может быть скопирована и вставлена в развитый class.
Когда вызвано на командную строку с одним или более именами class, serialver печатает serialVersionUID
для каждого class в форме, подходящей для того, чтобы скопировать в развивающийся class. Когда вызвано без параметров, это печатает строку использования.
private static final long serialVersionUID = 3487495895819393L;
Потоковый уникальный идентификатор является 64-разрядным хешем имени class, интерфейс имена class, методы, и поля. Значение должно быть объявлено во всех версиях class кроме первого. Это может быть объявлено в исходном class, но не требуется. Значение фиксируется для всех совместимых классов. Если SUID не объявляется для class, значений по умолчанию значения к хешу для того class. serialVersionUID
поскольку у динамических прокси-классов и перечислимых типов всегда есть значение 0L. Классы массива не могут объявить явное serialVersionUID
, таким образом, у них всегда есть значение по умолчанию вычисленное значение, но требование для того, чтобы соответствовать serialVersionUID
от значений отклоняют для классов массива.
serialVersionUID
значения, начиная со значения по умолчанию serialVersionUID
вычисление очень чувствительно к деталям class, которые могут измениться в зависимости от реализаций компилятора, и могут таким образом привести к неожиданному serialVersionUID
конфликты во время десериализации, заставляя десериализацию перестать работать. Externalizable
class должен вывести потоковый формат данных, который расширяем в будущем. Начальная версия метода readExternal
должен быть в состоянии считать выходной формат всех будущих версий метода writeExternal
. serialVersionUID
вычисляется, используя подпись потока байтов, которые отражают определение class. Национальный институт стандартов и технологий (NIST) Безопасный Хеш-алгоритм (SHA 1) используется, чтобы вычислить подпись для потока. Первые два 32-разрядных количества используются, чтобы сформировать 64-разрядный хеш. A java.lang.DataOutputStream
используется, чтобы преобразовать примитивные типы данных в последовательность байтов. Ввод значений к потоку определяется виртуальной машиной Java (VM) спецификация для классов. Модификаторы класса могут включать ACC_PUBLIC
, ACC_FINAL
, ACC_INTERFACE
, и ACC_ABSTRACT
флаги; другие флаги игнорируются и не влияют serialVersionUID
вычисление. Точно так же для полевых модификаторов, только ACC_PUBLIC
, ACC_PRIVATE
, ACC_PROTECTED
, ACC_STATIC
, ACC_FINAL
, ACC_VOLATILE
, и ACC_TRANSIENT
флаги используются, вычисляя serialVersionUID
значения. Для конструктора и модификаторов метода, только ACC_PUBLIC
, ACC_PRIVATE
, ACC_PROTECTED
, ACC_STATIC
, ACC_FINAL
, ACC_SYNCHRONIZED
, ACC_NATIVE
, ACC_ABSTRACT
и ACC_STRICT
флаги используются. Имена и дескрипторы пишутся в формате, используемом java.io.DataOutputStream.writeUTF
метод.
Последовательность элементов в потоке следующие:
private static
и private transient
поля: <clinit>
.java.lang.reflect.Modifier.STATIC
, записанный как 32-разрядное целое число.()V
.private
конструктор, сортированный именем метода и подписью: <init>
.private
метод, сортированный именем метода и подписью: DataOutputStream
и производит пять 32-разрядных значений sha[0..4]
.H0 H1 H2 H3 H4
, находится в массиве пять int
значения называют sha
, значение хэш-функции было бы вычислено следующим образом: long hash = ((sha[0] >>> 24) & 0xFF) | ((sha[0] >>> 16) & 0xFF) << 8 | ((sha[0] >>> 8) & 0xFF) << 16 | ((sha[0] >>> 0) & 0xFF) << 24 | ((sha[1] >>> 24) & 0xFF) << 32 | ((sha[1] >>> 16) & 0xFF) << 40 | ((sha[1] >>> 8) & 0xFF) << 48 | ((sha[1] >>> 0) & 0xFF) << 56;