2011-04-05 28 views
3

如果我將一個類定義爲Serialiable,那麼當我創建一個子類時,它會要求我定義一個serialVersionUID。這是必要的嗎,還是我可以依賴超級課程中的那個?序列化和子類

+2

[爲什麼要打擾serialVersionUID?](http://stackoverflow.com/questions/285793/why-should-i-bother-about-serialversionuid/285809#285809) – 2011-04-05 08:22:40

+0

http://stackoverflow.com/問題/ 285793/why-should-i-bother-about-serialversionuid – 2011-04-05 08:50:47

回答

3

如果您更改類的實現,但仍希望能夠對以「舊」格式保存的對象進行序列化/反序列化,則使用SerialVersionUID。所以這意味着如果你想改變子類而不是超類,你必須在子類中實現它。但是,如果你不需要這個「版本控制」,你根本不需要使用SerialVersionUID。

+0

在這種情況下,我是否會覆蓋警告並且根本不定義它?如果是這樣,當我更新我的應用程序時,會發生什麼情況,並且由於之前的保存而嘗試恢復該捆綁包? – theblitz 2011-04-05 09:17:41

+0

是的,你重寫它。但是如果捆綁軟件與早期版本一起保存,則無法從捆綁軟件恢復。我不知道你是否會得到一個異常或只是沒有加載對象。你可以在這裏閱讀序列化:http://java.sun.com/developer/technicalArticles/Programming/serialization/ – AndersG 2011-04-05 09:32:28

4

我曾經在不同的(可能是一流的)一次的serialVersionUID聲明,如:

public static final long GlobalSerialVersionUID=0L; 

然後在每個Serializable類中聲明:

private static final long serialVersionUID = MyTopClass.GlobalSerialVersionUID; 

這種做法將保證你將所有時間具有相同的SerialVersionUID,如果您將要在不同的序列化版本之間實現數據交換 - 您可以在不同的序列化版本之間分支代碼。