2012-05-10 6 views
1

Этот вопрос касается ObjectInputStream и того, как он создает поля, объявленные как переходные. Учитывая простой потребительной случай ObjectInputStreamСериализация через ObjectInputStream и переходные поля

FileInputStream fis = new FileInputStream("t.tmp"); 
ObjectInputStream ois = new ObjectInputStream(fis); 
SomeClass sc = (SomeClass) ois.readObject(); 

Где SomeClass является

class SomeClass { 
    int x; 
    transient OtherClass y; 
} 

class OtherClass { 
    int z; 
} 

, что будет значение sc.y после ois.readObject?

Я прошу уточнить, что я прочитал в docs.oracle.com, которая гласит

«Поля объявлено как переходные или статические игнорируются в процессе десериализации. Ссылки на другие объекты вызывают те объекты, которые будут считаны из потока по мере необходимости. "

Что означает, что переходные поля игнорируются? И как они могут быть считаны из потока, если они являются переходными (т.е. не сериализованная - как я понимаю ...)

Матфия

ответ

4

, что будет значение sc.y после ois.readObject ?

Someclass.y будет «значением по умолчанию». В этом случае, поскольку это объект, он будет null.

Что означает, что переходные поля игнорируются?

Они не сериализованы - они пропущены. Из Java Object Serialisation Specification:

сериализации класс должен сделать следующее:

  • Реализовать интерфейс java.io.Serializable
  • Определите поля, которые должны быть сериализуемым (Используйте serialPersistentFields элемент в явном виде объявить их сериализуемыми или использовать ключевое слово transient для обозначения несериализуемых полей.)

... и ...

Самый простой метод для обозначения полей, которые содержат конфиденциальные данные, как private transient. Временные поля не являются постоянными и не будут сохраняться каким-либо механизмом сохранения. Маркировка поля предотвратит появление состояния в потоке и его восстановление во время десериализации. Поскольку запись и чтение (частных полей) не могут быть заменены вне класса, переходные поля класса безопасны.

И ваш следующий вопрос:

И как они могут быть считаны из потока, если они являются переходными

Они не в потоке - это, на самом деле, они» не читается. Как упоминалось выше, в конечном итоге это значение «по умолчанию» для этого типа (null для объектов, 0/false для примитивов).

«Поля, объявленные как переходные или статические, игнорируются процессом десериализации».

Для наиболее общем случае, они игнорируются сериализации процесса - и из-за того, что они не в потоке, и не будет deserialised. Однако, если вы изменили класс после сериализации объекта так, чтобы поле, которое раньше было сериализовано, теперь помечено как переходное, тогда процесс десериализации будет игнорировать это значение, когда он найдет его в потоке.

+0

Спасибо Но не стесняйтесь отвечать на мои другие два вопроса :-) Может быть, вы также можете оправдать свой ответ? – Matthias

+0

Благодарим вас за ответ. Надеюсь, вы видите, как вы отвечаете, не соответствует официальной документации от oracle, где они заявляют, что «эти объекты читаются из потока по мере необходимости». Также мой вопрос о де-сериализации. – Matthias

+0

@Matthias: отредактирован снова. –

0

Какая ценность sc.y после ois.readObject?

Его значение по умолчанию: ноль, ложь или нуль.

Что означает, что переходные поля игнорируются?

Это означает, что они игнорируются. Они не участвуют в процессе сериализации или десериализации.

И как они могут быть считаны из потока, если они являются переходными (т.е. не сериализованная

Они не являются. Они не находятся в потоке, чтобы быть прочитан.

Смежные вопросы