2013-12-20 3 views
10

У меня проблема, связанная с использованием ключевого слова transient до модификатора private в java.Зачем использовать ключевое слово `transient` в 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.Что является целью использования этого ключевого слова?

+8

Указанная вами ссылка отвечает на ваши вопросы. В чем вы сомневаетесь? Что еще не было охвачено? –

+0

@PeterLawrey Редактировать мой вопрос PLS см. Мой класс его не реализует serialize – Sitansu

+0

Возможно, ваш класс будет сериализован библиотекой, которую вы используете, или 'transient' может использоваться библиотекой, которую вы используете с моделью для другой цели. Он может отображать все ваши поля в представлении, кроме «переходных». Вам нужно будет прочитать документацию для библиотеки, которую вы используете. –

ответ

27

переходные переменные никогда не сериализуются в 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.

+1

«Никогда» слишком силен. По умолчанию они не сериализуются *, но если вы пишете свои собственные методы readObject()/writeObject() ', вы можете их сериализовать самостоятельно. – EJP

6

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

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

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

+1

'transient' - это только о сериализации, и его значение точно определено JLS. '@ Transient' является аннотацией сторонних разработчиков, и без предоставления полного имени класса он неоднозначен. –

2

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

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

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

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

14

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

+1

Очень хороший вариант использования. Я искал это только. – iabhi

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