2013-12-20 28 views
10

我有一个与transient关键字在java中的private修饰符之前有关的问题。为什么在java中使用`transient`关键字?

变量声明:

transient private ResourceBundle pageResourceBundle; 

当我GOOGLE了它,我发现下面这些文档,但他们谈论的序列化。其实我的班级没有实现任何序列化。

欲了解更多信息:

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编辑我的问题,请参阅我的课程,它不实现序列化 – Sitansu

+0

它可能是您的类被您正在使用的库序列化,或'瞬态'可能被您正在使用模型库用于其他目的的库。它可能会在视图中显示除“瞬态”视图外的所有字段。您将不得不阅读您正在使用的库的文档。 –

回答

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,可能包含很多业务逻辑),则可以使用它。

@Transient注释表明对象不应保留(如果你一直在玩休眠,例如),但它可序列化

我已经包含了注释解释,因为我记得被两者混淆了。 :-)

+1

'transient'只是关于序列化,其含义是由JLS精确指定的。 '@Transient'是第三方定义的注释,没有给出完全限定的类名是不明确的。 –

2

transient用于指定其中对象的特性将不会被保存或序列。例如,将对象保存到文件时,transient指定将该对象保存到文件时哪些属性或属性不会保存到该文件。

当从文件重新创建对象时,该属性(或私有属性)的值将不会重新创建,因为它从未保存或序列化为该文件。在某些情况下,您可能想要避免保留某些对象的私有实例变量或属性,transient允许您这样做。

3
  • 瞬态关键字只能应用于成员变量。
    将其应用于方法或局部变量是编译错误。

  • Java中的关键字transient用于指示变量
    不应被序列化。默认情况下,对象 中的所有变量都转换为持久状态。在某些情况下,您可能希望
    避免持续某些变量,因为您没有必要通过网络传输 。因此,您可以将这些变量
    声明为transient

14

和一个简短的使用案例:
想象一下,通过一个公共可用的webservice暴露一个用户对象。 你确实想把事情公开为昵称,在线状态,可能是电子邮件或位置。 你肯定不会公开用户用来登录的密码。 虽然此密码可能是您的用户对象的属性,但它不应该被序列化,例如: 。将对象序列化为JSON时提到的webservice的字符串。

+1

非常不错的用例。我只是来寻找那个。 – iabhi

相关问题