Spec-Zone .ru
спецификации, руководства, описания, API
СОДЕРЖАНИЕ | ПРЕДЫДУЩИЙ | NEXT Спецификация Сериализации Объекта Java
версия 6.0

Дескрипторы класса






ГЛАВА 4

Темы:

4.1 Класс ObjectStreamClass

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.


4.2 Динамические Дескрипторы Прокси-класса

Дескрипторы ObjectStreamClass также используются, чтобы предоставить информацию о динамических прокси-классах (например, классы, полученные через звонки в getProxyClass метод java.lang.reflect. Прокси) сохраненный в потоке сериализации. У динамического прокси class нет никаких сериализуемых полей и serialVersionUID 0L. Другими словами, когда у объекта Класса для динамического прокси, class передают к статическому методу поиска ObjectStreamClass, возвращенный экземпляр ObjectStreamClass, будут следующие свойства:


4.3 Сериализированная Форма

Сериализированная форма экземпляра ObjectStreamClass зависит от того, возражает ли Класс, что это представляет, сериализуемо, externalizable, или динамический прокси class.

Когда ObjectStreamClass экземпляр, который не представляет динамический прокси class, пишется потоку, это написало имя class и serialVersionUID, флаги, и число полей. В зависимости от class может быть записана дополнительная информация:

Когда ObjectOutputStream сериализирует дескриптор ObjectStreamClass для динамического прокси class, как определено, передавая его объект Класса к isProxyClass методу java.lang.reflect. Прокси, это пишет число интерфейсов, которые называет динамический прокси реализации class, сопровождаемые интерфейсом. Интерфейсы перечисляются в порядке, что они возвращаются, вызывая getInterfaces метод на объекте Класса динамического прокси class.

Сериализированные представления дескрипторов ObjectStreamClass для динамических прокси-классов и нединамических прокси-классов дифференцируются с помощью различного typecodes (TC_PROXYCLASSDESC и TC_CLASSDESC, соответственно); для более подробной спецификации грамматики см. Раздел 6.4, "Грамматика для Потокового Формата".


4.4 Класс ObjectStreamField

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 метод возвращает печатаемое представление с именем и типом.


4.5 Осмотр Сериализуемых Классов

Программа serialver может использоваться, чтобы узнать, сериализуем ли class и получить serialVersionUID. Когда вызвано с опцией-шоу, это поднимает простой пользовательский интерфейс. Узнать, сериализуем ли class и узнать его serialVersionUID, введите его полное имя class, затем нажмите или Введение или кнопку Show. Напечатанная строка может быть скопирована и вставлена в развитый class.

serialver, Последовательный Инспектор Версии программа

Когда вызвано на командную строку с одним или более именами class, serialver печатает serialVersionUID для каждого class в форме, подходящей для того, чтобы скопировать в развивающийся class. Когда вызвано без параметров, это печатает строку использования.


4.6 Потоковые Уникальные идентификаторы

Каждый присвоил версию class, должен идентифицировать исходную версию 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 метод.

Последовательность элементов в потоке следующие:

  1. Имя class.
  2. Модификаторы class, записанные как 32-разрядное целое число.
  3. Имя каждого интерфейса, сортированного по имени.
  4. Для каждого поля class, сортированного именем поля (кроме private static и private transient поля:
    1. Имя поля.
    2. Модификаторы поля, записанного как 32-разрядное целое число.
    3. Дескриптор поля.
  5. Если инициализатор class существует, выпишите следующее:
    1. Имя метода, <clinit>.
    2. Модификатор метода, java.lang.reflect.Modifier.STATIC, записанный как 32-разрядное целое число.
    3. Дескриптор метода, ()V.
  6. Для каждого не -private конструктор, сортированный именем метода и подписью:
    1. Имя метода, <init>.
    2. Модификаторы метода, записанного как 32-разрядное целое число.
    3. Дескриптор метода.
  7. Для каждого не -private метод, сортированный именем метода и подписью:
    1. Имя метода.
    2. Модификаторы метода, записанного как 32-разрядное целое число.
    3. Дескриптор метода.
  8. SHA 1 алгоритм выполняется на потоке байтов, произведенных DataOutputStream и производит пять 32-разрядных значений sha[0..4].
  9. Значение хэш-функции собирается от первых и вторых 32-разрядных значений SHA 1 обзор сообщения. Если результат обзора сообщения, пяти 32-разрядных слов 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;
                             
    


СОДЕРЖАНИЕ | ПРЕДЫДУЩИЙ | NEXT
Авторское право © 2005, 2010, Oracle и/или его филиалы. Все права защищены.