2013-07-25 37 views
4

我正在閱讀關於java.Java中的序列化,表示靜態變量不與對象序列化。序列化過程中必須有序列化。當對象序列化時,serialVersionUID會與其他內容一起序列化。這是一般序列化規則的一個例外,即「靜態字段未被序列化」爲什麼SerialVersionUID是靜態的

有人可以告訴我爲什麼它是static.it可以是非靜態的嗎?

回答

5

因爲任何對象變量/成員可以訪問一旦Object成功創建。您不能訪問對象變量而不創建它。現在回到問題,在反序列化過程中,Object需要從數據創建。如果無法檢查對象是否反序列化,則無法獲取對象成員。

出於同樣的原因,UID是靜態的。

0

serialVersionUID是一個慣例,用於驗證您在序列化程序和解串程序中都具有相同的二進制版本,並且過時的版本沒有任何問題。另外,可能會出現這樣的情況,即對於反序列化器中不同種類的類具有相同的名稱,因此serialVersionUID就像是一個排序和唯一標識符。

這就是爲什麼它必須是靜態的(所以它是「界的類,而不是每個實例)和‘派’與串行數據一起。

0

它,因爲它是由授權是靜態的JRE有這麼推理可以很簡單,它可以在一個靜態的方式進行訪問,而無需實際創建一個類的對象

javadocs:。

每個序列化

的序列化運行聯營A級 版本號稱爲serialVersionUID,它在 反序列化過程中用於驗證序列化對象的發送者和接收者是否已經爲該對象加載了與序列化兼容的類。如果接收方已加載 對象的類,該對象的serialVersionUID與 對應的發送者類不同,則反序列化將導致InvalidClassException。可序列化類可以通過聲明名爲「的serialVersionUID」的字段 必須是靜態的,最終明確地聲明自己的 的serialVersionUID,並鍵入長:

+0

它不說爲什麼?我認爲OP很想知道爲什麼JRE要求它是靜態的 – sanbhat

0

這是一個例外,它被序列化。我相信它是static,因爲它綁定到類,而不是類的任何實例。該班級的所有實例都應該遵守相同的serialVersionUID。再次將其設置爲靜態意味着運行時可以實際獲得該ID而不創建任何對象,而反序列化對象的先決條件是確定ID。當一個對象被序列化時,類名,對象的狀態(非靜態成員變量)和serialVersionUID都會被持久化。

0

序列化運行時與每個可序列化的類關聯一個稱爲serialVersionUID的版本號,該版本號在反序列化過程中用於驗證序列化對象的發件人和接收者是否已加載與該序列化兼容的該對象的類。如果接收者已經爲與對應的發送者類具有不同serialVersionUID的對象加載了類,則反序列化將導致InvalidClassException。可序列化類可以通過聲明名爲「serialVersionUID的」字段必須是靜態的,最終明確宣佈了自己的serialVersionUID,並鍵入長:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; 

其聲明爲static作爲帶班並沒有任何功能相關的/變量。

1

首先,您應該瞭解serialVersionUID的功能。

java.io.Serializable

序列化運行時相關聯,每個序列化類一個 版本號,稱爲的serialVersionUID,該期間 反序列化用於驗證序列化 對象的發送者和接收者已加載該對象的類與 方面兼容。如果接收方已加載 對象的類,該對象的serialVersionUID與 對應的發送者類不同,則反序列化將導致InvalidClassException。

serialVersionUID確定不同版本的類之間的兼容性。由於該房產必須上課,因此必須撥打static

0

serialVersionUID是靜態的,因爲它不適用於類實例,而是類本身。它保存在ObjectOutputStream類描述符中。

相關問題