如果我有B擴展A ...和A實現Serializable,我必須寫「B實現Serializable」嗎?如果我的類實現了Serializable,我必須在它的子類中實現它嗎?
我覺得沒什麼,但我想確認......
也是,如果我把序列號在一...我需要把一個在B還?應該在序列化ID在A被保護(而不是私人)?
如果我有B擴展A ...和A實現Serializable,我必須寫「B實現Serializable」嗎?如果我的類實現了Serializable,我必須在它的子類中實現它嗎?
我覺得沒什麼,但我想確認......
也是,如果我把序列號在一...我需要把一個在B還?應該在序列化ID在A被保護(而不是私人)?
是的。子類不需要明確標記爲可序列化。
和,標記id爲protected
會做。 (編譯自角度)
但是,正如好的做法每類應該有它的保護將會從編譯器的角度就足夠了自己的私人serialVersionUid
不,因爲B已經通過它的基類A實現了它。這就是繼承的全部意義。
標記ID。然而,從理論上講,Serializable
類中的serialVersionUID
字段的要點是,在反序列化類時很容易區分類的「版本」 - 清楚地表示何時可以將給定對象反序列化爲提供的類的實例(如果serialVersionUID
s是不同的,拋出異常)。如果您希望能夠清楚地跟蹤對象的版本和性質,請在每個子類上聲明serialVersionUID
。
在我的協議@azodious答案,兒童類繼承父類的序列化的屬性,但是你必須要申報的serialVersionUID 明確。
從Java文檔: https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html
它還強烈建議,明確的serialVersionUID 聲明使用private修飾符在可能的情況,因爲這種 聲明僅適用於立即宣佈 類 - 的serialVersionUID字段沒有用作繼承成員。
您不必顯式標記派生爲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
Java對象是可序列化如果其類或其任意的超類的實施任一java.io.可序列化接口或其子接口,java.io.Externalizable。
你可以看看官方文檔,找到這個有: https://docs.oracle.com/javase/tutorial/jndi/objects/serial.html
不健全表露無疑,但它會花費較少的時間,只是試試這個比它把你寫的這個問題。 – 2012-02-04 16:47:35
聽起來不那麼嚴肅,但如果這個建議一直受到重視,這將是一個非常非常小的網站。 – 2018-02-11 19:36:36