Зачем использовать ключевое слово "transient" в java? [дубликат]

этот вопрос уже есть ответ здесь:

у меня вопрос transient использование ключевого слова перед private модификатор в java .

переменной:

transient private ResourceBundle pageResourceBundle; 

когда я гуглил, я нашел эти документы, но они говорят о сериализации. На самом деле мой класс не реализует сериализованные.

дополнительная информация:

http://java91.blogspot.in/2017/01/why-does-java-have-transient-fields.html

мой класс выглядит так :

public class LoginViewModel extends AbstractViewModel {

    transient private ResourceBundle pageResourceBundle;

    @AfterCompose
    public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {
        initializeLoginValues();
        boolean timeout = BooleanUtils.toBoolean(getHttpServletRequest().getParameter("timeout"));
        if (timeout) {
            Messagebox.show(pageResourceBundle.getText("MSG_SESSION_HAS_EXPIRED_PLEASE_LOGIN"), pageResourceBundle.getText("LABEL_ALERT"),
                    Messagebox.OK, Messagebox.ERROR);
        }
        view.getPage().setTitle(CsdcLicence.get().getApplicationName());
    }

у меня есть несколько вопросов.

1.зачем использовать transient ключевое слово перед частной переменной?

2.какова цель использования этого ключевого слова?

5 ответов


переходные переменные никогда не сериализуются в java.

он отмечает переменную-член, которая не сериализуется, когда она сохраняется в потоках байтов. Когда объект передается через сеть, объект должен быть сериализован'. Сериализация преобразует состояние объекта в последовательные байты. Эти байты отправляются по сети, и объект воссоздается из этих байтов. Переменные-члены, отмеченные ключевым словом Java transient, не передаются, они теряются намеренно.

пожалуйста, посмотрите на что сериализация есть.? а также см. этой

пример

public class Foo implements Serializable
{
  private String saveMe;
  private transient String dontSaveMe;
  private transient String password;
  //...
}

В приведенном выше примере dontSaveMe & password никогда не сериализуются, поскольку они объявляются как transient variables.


и короткий прецедент:
Представьте, что вы предоставляете пользовательский объект через общедоступный веб-сервис. Вы уверены, что хотели бы выставить вещи как псевдоним, онлайн-состояние, возможно, электронную почту или местоположение. Вы определенно не захотите раскрывать пароль, который пользователь использует для входа в систему. Хотя этот пароль может быть свойством вашего User-object, он не должен сериализовываться, например, при сериализации объекта в JSON - строку для упомянутого веб-сервиса.


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

@Transient аннотация предполагает, что объект не следует настаивать (если Вы играли с Hibernate, например), но это может быть сериализован.

Я включил пояснение аннотации, потому что я помню, что был смущен этими двумя. :-)


  • Ключевое слово Transient может применяться только к переменным-членам.
    Применение его к методу или локальной переменной является ошибкой компиляции.

  • ключевое слово transient в Java используется для указания того, что переменная
    не следует сериализовывать. По умолчанию все переменные в объекте преобразуются в постоянное состояние. В некоторых случаях вы можете захотеть
    избегайте сохранения некоторых переменных, потому что у вас нет необходимости для передачи через сеть. Таким образом, вы можете объявить эти переменные
    as transient.


transient используется для указания, какие свойства объекта не будут сохранены или сериализованный. Например, при сохранении объекта в файл transient указывает, какие свойства или атрибуты не будут сохранены в этом файле при сохранении этого объекта в файл.

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