如果一個實現了Serializable的類沒有serialVersionUID屬性,IDE(比如Eclipse)通常會報這樣一個warning:
The serializable class Foo does not declare a static finalserialVersionUID field of type long
那這個serialVersionUID是做什么用的呢?可以看看JDK中Serializable接口的注釋。
The serialization runtime associates with each serializable class aversion number, called a serialVersionUID, which is used duringdeserialization to verify that the sender and receiver of aserialized object have loaded classes for that object that arecompatible with respect to serialization. If the receiver has loadeda class for the object that has a different serialVersionUID thanthat of the corresponding sender's class, then deserialization willresult in an InvalidClassException}. A serializable class candeclare its own serialVersionUID explicitly by declaring a fieldnamed
"serialVersionUID"
that must be static, final, andof typelong
:serialVersionUID 表示可序列化類的版本,在反序列化對象時,用來確認序列化與反序列化該對象所使用的類的版本是否兼容。如果類的版本不一致,那么反序列化將不能正常進行,拋出InvalidClassException。
If a serializable class does not explicitly declare aserialVersionUID, then the serialization runtime will calculate adefault serialVersionUID value for that class based on variousaspects of the class, as described in the Java(TM) ObjectSerialization Specification. However, it is stronglyrecommended that all serializable classes explicitly declareserialVersionUID values, since the default serialVersionUIDcomputation is highly sensitive to class details that may varydepending on compiler implementations, and can thus result inunexpected
InvalidClassException
s duringdeserialization. Therefore, to guarantee a consistentserialVersionUID value across different java compilerimplementations, a serializable class must declare an explicitserialVersionUID value. It is also strongly advised that explicitserialVersionUID declarations use thePRivate
modifierwhere possible, since such declarations apply only to the immediatelydeclaring class--serialVersionUID fields are not useful as inheritedmembers. Array classes cannot declare an explicit serialVersionUID,so they always have the default computed value, but the requirementfor 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
新聞熱點
疑難解答