[Java] The SerialVersionUID

當實作了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
2
3
4
5
6
7
public class Person implements Serializable{
private static final long serialVersionUID = 1L;

private int age;

private String addres;
}

接收方將Person Object序列化存到硬碟上。

之後Person Object做了修改

1
2
3
4
5
public class Person implements Serializable{
private static final long serialVersionUID = 2L;

private String name;
}

此時,接收方嘗試Person Object反序列化,就會丟出InvalidClassException。

那些情況屬於不可相容的改變,請參考:Incompatible Changes

那些情況屬於可相容的改變,請參考:
Compatible Changes

當Object內容改變,可以根據上述連結來判定屬於可相容的改變或是不可相容的改變。若是不可相容的改變就要修正serialVersionUID的值。

參考資料: