2013-12-20 32 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

相關問題