當實作了Serializable interface時,Eclipse總是會提醒你1
The serializable class xxx does not declare a static final serialVersionUID field of type long
serialVersionUID相當於這個Object的版本控管,若不宣告serialVersionUID,JVM會協助產生。但是因為演算法對Object內容有相當高的敏感度和不同的JVM有不同的實作方式,所以有可能Object都一樣,但是在不同JVM上算出的serialVersionUID卻是不同,丟出InvalidClassException。
範例:
1 | public class Person implements Serializable{ |
接收方將Person Object序列化存到硬碟上。
之後Person Object做了修改1
2
3
4
5public class Person implements Serializable{
private static final long serialVersionUID = 2L;
private String name;
}
此時,接收方嘗試Person Object反序列化,就會丟出InvalidClassException。
那些情況屬於不可相容的改變,請參考:Incompatible Changes
那些情況屬於可相容的改變,請參考:
Compatible Changes
當Object內容改變,可以根據上述連結來判定屬於可相容的改變或是不可相容的改變。若是不可相容的改變就要修正serialVersionUID的值。