2012-02-04 79 views
27

如果我有B擴展A ...和A實現Serializable,我必須寫「B實現Serializable」嗎?如果我的類實現了Serializable,我必須在它的子類中實現它嗎?

我覺得沒什麼,但我想確認......

也是,如果我把序列號在一...我需要把一個在B還?應該在序列化ID在A被保護(而不是私人)?

+2

不健全表露無疑,但它會花費較少的時間,只是試試這個比它把你寫的這個問題。 – 2012-02-04 16:47:35

+0

聽起來不那麼嚴肅,但如果這個建議一直受到重視,這將是一個非常非常小的網站。 – 2018-02-11 19:36:36

回答

15

是的。子類不需要明確標記爲可序列化。

和,標記id爲protected會做。 (編譯自角度)

但是,正如好的做法每類應該有它的保護將會從編譯器的角度就足夠了自己的私人serialVersionUid

+0

謝謝,任何想法如何擺脫關於沒有序列版本ID聲明的黃色月食警告? – ycomp 2012-02-04 16:58:34

+0

更強大的方式將被定義爲'private static final' – Azodious 2012-02-04 17:01:05

+3

是的。來自文檔「可序列化類的所有子類本身都是可序列化的。」 http://download.java.net/jdk8/docs/api/java/io/Serializable.html – vsingh 2013-09-30 20:09:23

3

不,因爲B已經通過它的基類A實現了它。這就是繼承的全部意義。

8

標記ID。然而,從理論上講,Serializable類中的serialVersionUID字段的要點是,在反序列化類時很容易區分類的「版本」 - 清楚地表示何時可以將給定對象反序列化爲提供的類的實例(如果serialVersionUID s是不同的,拋出異常)。如果您希望能夠清楚地跟蹤對象的版本和性質,請在每個子類上聲明serialVersionUID

+0

我認爲'serialVersionUIDs'是爲JVM聲明以識別類中的變化。 JVM可以從基類中得到它,所以它不應該有任何區別。 – Azodious 2012-02-04 16:59:47

+0

好吧,但我的觀點確實如此,不要將serialVersionUID視爲您試圖擺脫的煩惱。瞭解爲什麼它在那裏,並適當地對待它。 – 2012-02-04 17:05:57

+0

是的,但我們可以有兩個具有相同'serialVersionUID'的不同類。如果它是一個簡單的類而不顯式擴展任何類,那麼它應該是強制性的。 – Azodious 2012-02-04 17:09:32

7

在我的協議@azodious答案,兒童類繼承父類的序列化的屬性,但是你必須要申報的serialVersionUID 明確

從Java文檔: https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html

它還強烈建議,明確的serialVersionUID 聲明使用private修飾符在可能的情況,因爲這種 聲明僅適用於立即宣佈 類 - 的serialVersionUID字段沒有用作繼承成員。

8

您不必顯式標記派生爲Serializable它將被繼承。但是,來自父級的serialVersionUID雖然是繼承的,但不會被序列化過程使用。如果你沒有添加一個serialVersionUID到孩子,將會生成一個。

見下:

public class A implements Serializable { 
    protected static final long serialVersionUID = 1L; 
} 

public class B extends A { 
} 

public class Main { 

    public static void main(String[] args){ 

     A a = new A(); 
     B b = new B(); 

     Class aClass = a.getClass(); 
     Class bClass = b.getClass(); 

     long aUid = ObjectStreamClass.lookup(aClass).getSerialVersionUID(); 
     long bUid = ObjectStreamClass.lookup(bClass).getSerialVersionUID(); 

     System.out.printf("serialVersionUID:\n"); 
     System.out.printf("b inherited from a: %d\n", b.serialVersionUID); 
     System.out.printf("a used by serialization: %d\n",aUid); 
     System.out.printf("b used by serialization: %d\n",bUid); 
    } 

} 

輸出:

的serialVersionUID:由序列化使用1

一個:1個

B中使用

b。從一個繼承通過序列化:-367523 2183873847366

相關問題