Java 規定的內部機制,實現 Serializable 接口就好了,這個接口只是個標記性的接口,表示類的設計者已經容許這個類型的對象被序列化寫入磁盤或經過網絡發送,對於有保密要求的東西通常不實現這個接口防止無心間複製到 jvm 內存以外。若是一個類型的多數字段能夠複製但個別字段不用複製(好比,它其實是經過其它字段計算出來的),咱們能夠把它標記爲 transient。
默認的 serialization 對類的結構有要求,通常未來版本升級了致使服務端和客戶版本不同,或者你用新版本讀取一個之前舊版本寫入磁盤的序列化的對象的話,須要這兩個版本是兼容的,達到這個要求至少包括下面這個字段,而且新舊兩個版本的類中它的值應該是同樣的,其它特殊狀況規範也有辦法作到,好比你的結構變了,之前 name / phone 都是 A 的字段,後來新版本建立了一個內部類叫 Contact 把 name 和 phone
併到這兩個字段移到內部類 Contact 中去了的話,Java 也有辦法在新版本中提供自定義 readObject/writeObject 這個過程來確保兼容舊版本。
private static final long serialVersionUID; // 在一個類的多個版本中要相同的值,對於不它的類中,它們的值不要求惟一。
http://java.sun.com/developer/technicalArticles/Programming/serialization/java
serialVersionUID做用:序列化時爲了保持版本的兼容性,即在版本升級時反序列化仍保持對象的惟一性。 有兩種生成方式: 一個是默認的1L,好比:private static final long se... 網絡
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便可。
若是你沒有考慮到兼容性問題時,就把它關掉,不過有這個功能是好的,只要任何類別實現了Serializable這個接口的話,若是沒有加入serialVersionUID,Eclipse都會給你warning提示,這個serialVersionUID爲了讓該類別Serializable向後兼容。
若是你的類Serialized存到硬盤上面後,但是後來你卻更改了類別的field(增長或減小或更名),當你Deserialize時,就會出現Exception的,這樣就會形成不兼容性的問題。
但當serialVersionUID相同時,它就會將不同的field以type的預設值Deserialize,可避開不兼容性問題。jvm