serialVersionUID---java序列化

serialVersionUID適用於Java的序列化機制。簡單來說,Java的序列化機制是通過判斷類的serialVersionUID來驗證版本一致性的。在進行反序列化時,JVM會把傳來的字節流中的serialVersionUID與本地相應實體類的serialVersionUID進行比較,如果相同就認爲是一致的,可以進行反序列化,否則就會出現序列化版本不一致的異常,即是InvalidCastException。

serialVersionUID有兩種顯示的生成方式:        
一是默認的1L,比如:private static final long serialVersionUID = 1L;        
二是根據類名、接口名、成員方法及屬性等來生成一個64位的哈希字段,比如:        
private static final  long   serialVersionUID = xxxxL;

當一個類實現了Serializable接口,如果沒有顯示的定義serialVersionUID,Eclipse會提供相應的提醒。面對這種情況,我們只需要在Eclipse中點擊類中warning圖標一下,Eclipse就會      自動給定兩種生成的方式。如果不想定義,在Eclipse的設置中也可以把它關掉的,設置如下:
Window ==> Preferences ==> Java ==> Compiler ==> Error/Warnings ==> Potential programming problems
將Serializable class without serialVersionUID的warning改成ignore即可。

當實現java.io.Serializable接口的類沒有顯式地定義一個serialVersionUID變量時候,Java序列化機制會根據編譯的Class自動生成一個serialVersionUID作序列化版本比較用,這種情況下,如果Class文件(類名,方法明等)沒有發生變化(增加空格,換行,增加註釋等等),就算再編譯多次,serialVersionUID也不會變化的。

如果我們不希望通過編譯來強制劃分軟件版本,即實現序列化接口的實體能夠兼容先前版本,就需要顯式地定義一個名爲serialVersionUID,類型爲long的變量,不修改這個變量值的序列化實體都可以相互進行串行化和反串行化。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章