如果一個實現了Serializable的類沒有serialVersionUID屬性,IDE(比如Eclipse)通常會報這樣一個warning:
The serializable class Foo does not declare a static final
serialVersionUID field of type long
那這個serialVersionUID是做什么用的呢?可以看看JDK中Serializable接口的注釋。
The serialization runtime associates with each serializable class a
version number, called a serialVersionUID, which is used during
deserialization to verify that the sender and receiver of a
serialized object have loaded classes for that object that are
compatible with respect to serialization. If the receiver has loaded
a class for the object that has a different serialVersionUID than
that of the corresponding sender's class, then deserialization will
result in an {@link InvalidClassException}. A serializable class can
declare its own serialVersionUID explicitly by declaring a field
named"serialVersionUID"
that must be static, final, and
of typelong
:serialVersionUID 表示可序列化類的版本,在反序列化對象時,用來確認序列化與反序列化該對象所使用的類的版本是否兼容。
如果類的版本不一致,那么反序列化將不能正常進行,拋出InvalidClassException。If a serializable class does not explicitly declare a
serialVersionUID, then the serialization runtime will calculate a
default serialVersionUID value for that class based on various
aspects of the class, as described in the Java(TM) Object
Serialization Specification. However, it is strongly
recommended that all serializable classes explicitly declare
serialVersionUID values, since the default serialVersionUID
computation is highly sensitive to class details that may vary
depending on compiler implementations, and can thus result in
unexpectedInvalidClassException
s during
deserialization. Therefore, to guarantee a consistent
serialVersionUID value across different java compiler
implementations, a serializable class must declare an explicit
serialVersionUID value. It is also strongly advised that explicit
serialVersionUID declarations use theprivate
modifier
where possible, since such declarations apply only to the immediately
declaring class--serialVersionUID fields are not useful as inherited
members. Array classes cannot declare an explicit serialVersionUID,
so they always have the default computed value, but the requirement
for matching serialVersionUID values is waived for array classes.如果一個可序列化的類沒有包含serialVersionUID,運行時會根據這個類的特征自動計算出一個serialVersionUID。
那么,為什么不能用默認的這個實現呢,似乎更省事?
因為不同的編譯器實現會導致同一個類的源代碼文件,被計算出不同的serialVersionUID.
StackOverflow上有一個類似的問題:
http://stackoverflow.com/questions/285793/what-is-a-serialversionuid-and-why-should-i-use-it
點擊下面這個鏈接,可以查看更多關於Serializable接口的信息:
https://github.com/ZhaoX/jdk-1.7-annotated/blob/master/src/java/io/Serializable.java