Wednesday 3 January 2018

java - What is a serialVersionUID and why should I use it?

itemprop="text">

Eclipse issues warnings when a
serialVersionUID is missing.




The serializable
class Foo does not declare a static final
serialVersionUID field of type
long





What
is serialVersionUID and why is it important? Please show an
example where missing serialVersionUID will cause a
problem.



Answer




The docs for href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/Serializable.html"
rel="noreferrer">java.io.Serializable are probably
about as good an explanation as you'll
get:




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

href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/InvalidClassException.html"
rel="noreferrer">InvalidClassException. A
serializable class can declare its own serialVersionUID
explicitly by declaring a field named serialVersionUID that
must be static, final, and of type
long:




ANY-ACCESS-MODIFIER
static final long serialVersionUID = 42L;



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 unexpected InvalidClassExceptions 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 the private modifier
where possible, since such declarations apply only to the immediately declaring class
serialVersionUID fields are not useful as inherited
members.



No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...