2012-06-14 30 views
1

在學習java序列化概念的過程中,我一度感到困惑。在Java序列化過程中,我們使用2個關鍵字來防止序列化,即瞬態和靜態。如果我不想保存一個實例變量,我應該使用哪個關鍵字,兩者完全相同。這是java java關鍵字跳過java序列化

Class A implements Serializable{ 
    private static int x; 
    private transient int y; 
    private transient static int x; 
} 

在上面的代碼中,所有三個實例變量都不保存在序列化過程中。哪個關鍵字適合並建議防止序列化。爲什麼兩個關鍵字具有幾乎相同的功能。推薦的防止序列化的方式是什麼?糾正我,如果我錯了,我還在學習。

回答

11

static關鍵字變換實例變量成一個靜態變量。副作用是該字段不再被序列化......因爲它不再是字段。

靜態變量是類的變量。實例變量是對象的變量,或類的實例。你不能盲目地從一個走向另一個。

閱讀有關實例和靜態變量的tutorial page

當然,transient關鍵字是正確使用的關鍵字。

4

你很困惑:static字段不是實例變量,它們是類的變量。通過聲明一個字段static相同的字段在該類的所有實例之間共享 - 它不再是任何特定對象的一部分,導致它不被序列化。

要特別防止系列化僅transient適用...

2

瞬態(和JAXB XmlTransient中的)表示數據是短暫的並且不是永久重要的,因此在涉及持久性時應該忽略它。

靜態意味着該值適用於類級別,因此對多個實例進行序列化/反序列化將會不安全,因爲值會發生衝突。

0

那麼,讓我再次定義序列化。

A serialization is a process in which we persist state of an object. 

那麼,任何靜態變量都是對象狀態的一部分嗎?絕對沒有。這是在一個班的所有對象之間共享的數據。很明顯,任何靜態變量都不應該與對象的狀態序列化。

我們假設,我們可以堅持一個對象的狀態。後來,如果這個變量被其他對象/類本身所改變,並且如果我們試圖反序列化對象,那麼這個靜態變量將保存什麼值。會有衝突。

因此,如果您想阻止任何實例變量被序列化,請使用瞬態。 當你將反序列化對象時,它將被初始化爲默認值。