2016-03-05 24 views

回答

1

是否有必要取決於可序列化的類以及它將如何使用。

如果類的實例根本不會被序列化,那麼它絕對沒有區別。 serialVersionUID僅在對象序列化和反序列化時使用。

serialVersionUID領域的效用時,代理商做的序列化和反序列化可能潛在使用不同版本的類或者可以在不同的Java平臺上運行的出現。以下是Object Serialization Spec所說的內容:

流唯一標識符是類名稱,接口類名稱,方法和字段的64位散列。該值必須在除第一個類之外的所有類的版本中聲明。它可以在原始類中聲明,但不是必需的。該值對所有兼容類都是固定的。如果沒有爲類聲明SUID,則該值默認爲該類的哈希值。動態代理類的serialVersionUIDenum類型的值始終爲0L。數組類不能聲明明確的serialVersionUID,因此它們始終具有默認的計算值,但對於數組類,可以免除匹配serialVersionUID值的要求。

注 - 強烈建議所有可序列化類中明確聲明serialVersionUID值,因爲默認serialVersionUID計算是類的細節可能取決於編譯器實現變化高度敏感,並因此可能導致反序列化過程中意外serialVersionUID衝突,造成反序列化失敗。

總結說:

  • 如果你不聲明serialVersionUID,你可以得到所造成的不屬於真正的衝突無端例外。 (例如,如果你只是改變了方法不改變類的代表性語義。)

  • 但是,如果你聲明serialVersionUID,而你做的做了不兼容的變化的一類,那麼你應該要更改serialVersionUID的值......除非您要使用對象序列化提供的「即時」轉換的其他機制之一。

注意SUIDs試圖提供一個切實可行的解決方案到schema evolution problem。這是一個非常困難的問題。


1 - 從類型論的角度來看這聽起來不太合理。違反類型抽象有許多方法。然而,SUID機制是非常實用的,並且鑑於Java編程語言的性質,對效率的需求等等,它是可能的。

+0

感謝您的回答 因爲我可以從後我想我並不需要使用的serialVersionUID因爲我不是交換類的對象去進行序列化和反序列化 – MRTC

相關問題