Подтвердить что ты не робот

Как маркировка поля как переходного процесса позволяет сериализовать объект

public class Foo implements java.io.Serializable {
   private int v1;
   private static double v2;
   private Loan v3 = new Loan();
}

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

Ответ: D

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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