It is simple to make a class serializable, just have it implement the java.io.Serializable
interface. However it is not easy to support the serialized form forever.
One issue is the serial version UID. Every serializable class has a unique identification number associated with it. If you do not specify the identification number explicitly by declaring a private static final long field named serialVersionUID
, the system automatically generates it by applying a complex deterministic procedure to the class… If you change [the class] in any way … the automatically generated serial version UID changes. If you fail to declare an explicit serial version UID, compatibility will be broken.
Bloch, Joshua. Effective Java. p. 214
To generate the serial version UID for a class use the serialver
tool which comes with the Java SDK. The serialver
tool returns the serial version UID for one or more classes.
Example:
$ serialver -classpath 'build;C:/foo/classes.jar' com.bar.FooMessage
or
> serialver -classpath build;C:\foo\classes.jar com.bar.FooMessage
An even easier way to generate the serial version UID is to use the Eclipse IDE. If your class implements the java.io.Serializable
interface and it does not have a serial version UID then Eclipse will give a warning about this next to the class name. If you click on the warning you can choose the option “Add generated serial version ID.”
Note, currently there is a bug with Eclipse and generating the serial version UID. When attempting to generate a serial version UID you will see a dialogue window which says “Computing serial version ID….” and “Starting virtual machine…”. Unfortunately this hangs and you are forced to kill your Eclipse IDE. I started seeing this bug yesterday after installing some JDBC plugins and the GEF plugin, I’m not sure if it’s related to that. I tried disabling the plugins but I still see the problem. Before I wasn’t having this problem.