serialVersionUID 做用

類序列化和反序列化後,修改類(加字段或方法) 遇到異常:java

Exception in thread 「main」 java.io.InvalidClassException: Person; local class incompatible: stream classdesc serialVersionUID = 8383901821872620925, local class serialVersionUID = -763618247875550322算法

意思就是說,文件流中的class和classpath中的class,也就是修改事後的class,不兼容了,處於安全機制考慮,程序拋出了錯誤,而且拒絕載入。那麼若是咱們真的有需求要在序列化後添加一個字段或者方法呢?應該怎麼辦?那就是本身去指定serialVersionUID。以前,在咱們的例子中,咱們是沒有指定serialVersionUID的,那麼java編譯器會自動給這個class進行一個摘要算法,相似於指紋算法,只要這個文件多一個空格,獲得的UID就會大相徑庭的,能夠保證在這麼多類中,這個編號是惟一的。因此,咱們添加了一個字段後,因爲沒有顯指定serialVersionUID,編譯器又爲咱們生成了一個UID,固然和前面保存在文件中的那個不會同樣了,因而就出現了2個號碼不一致的錯誤。所以,只要咱們本身指定了serialVersionUID,就能夠在序列化後,去添加一個字段,或者方法,而不會影響到後期的還原,還原後的對象照樣可使用,並且還多了方法能夠用,呵呵。可是serialVersionUID咱們怎麼去生成呢?你能夠寫1,也能夠寫2,都無所謂,可是最好仍是按照摘要算法,生成一個唯一的指紋數字,eclipse能夠自動生成的,jdk也自帶了這個工具。通常寫法相似於 private static final long serialVersionUID = -763618247875550322L;安全

相關文章
相關標籤/搜索