Зачем использовать ключевое слово `transient` в java?

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

объявление переменной:

transient private ResourceBundle pageResourceBundle; 

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

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. какова цель использования этого ключевого слова?

Ответ 1

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

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

пожалуйста, посмотрите, что serialization есть.? и также ссылайтесь на this

Пример

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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