Как маркировка поля как переходного позволяет сериализовать объект - PullRequest
13 голосов
/ 03 марта 2011
public class Foo implements java.io.Serializable {
   private int v1;
   private static double v2;
   private Loan v3 = new Loan();
}

Параметры:
О. Экземпляр Foo может быть сериализован, потому что Foo реализует Serializable.
B. Экземпляр Foo нельзя сериализовать, поскольку Foo содержит несериализуемую переменную экземпляра v3.
C. Если вы пометите v3 как временный, экземпляр Foo будет сериализуемым.
D. б и с

Ответ: D

Объяснение: Объект не может быть сериализован, даже если его класс реализует java.io.Serializable, поскольку он может содержать не сериализуемые переменные экземпляра.

Теперь мой вопрос:

Насколько я знаю, переходный процесс используется для отключения сериализации. Тогда как переходный процесс в этом случае помогает нам сериализовать foo?

Ответы [ 3 ]

20 голосов
/ 03 марта 2011

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

В этом случае я предполагаю, что класс Loan не сериализуем.(Если бы это было так, то А было бы правильным.) Обозначение v3 как переходного процесса просто говорит Java не беспокоиться об этом поле, а идти дальше и сериализовать остальные.Это означает, что несериализованный Foo может иметь значение v3.Если вы также хотите сохранить Loan, вам нужно будет либо отслеживать достаточно информации, чтобы воссоздать ее по своему желанию, либо изменить класс Loan, чтобы он также реализовывал java.io.Serializable.

В качестве альтернативы есть методы, которые вы можете реализовать (writeObject, readObject), если вам нужен контроль над сериализацией.Но это может быть немного хлопот.

2 голосов
/ 03 марта 2011

Тогда как переходный процесс в этом случае, помогает нам сериализовать foo?

Поскольку он позволяет сериализовать rest Foo, остальные члены, которые являются сериализуемыми.

0 голосов
/ 03 марта 2011

Во-первых, вы уверены, что Loan не сериализуем? Если это так, то B не применяется.

С другой стороны, если это действительно так, то B и C правы. transient обычно не отключает сериализацию, а только для поля, с которым она связана. Таким образом, сериализация Foo не будет передавать значение для поля v3. На принимающей стороне при повторной инициализации экземпляра Foo механизм сериализации не будет пытаться прочитать это поле из потока и оставит его пустым.

...