Preventing ClassCastExceptions with SerialVersionUID
Problem
Your class got
recompiled, and you’re getting
ClassCastException
s that you shouldn’t.
Solution
Run serialver and paste its output into your classes before you start.
Discussion
When a class is undergoing a period of evolution, particularly a
class being used in a networking context such as RMI or servlets, it
may be useful to provide a serialVersionUID
value
in this class. This is a long integer that is basically a hash of the
methods and fields in the class. Both the object serialization API
(see Section 9.17) and the JVM, when asked to cast
one object to another (common when using collections, as in Chapter 7), either look up or, if not found, compute
this value. If the value on the source and destination do not match,
a ClassCastException
is thrown. Most of the time,
this is the correct thing for Java to do.
However, there may be times when you want to allow a class to evolve
in a compatible way, but you can’t immediately replace all
instances in circulation. You must be willing to write code to
account for the additional fields being discarded if restoring from
the longer format to the shorter, and having the default value (null
for objects,
for numbers and false for boolean) if restoring from the shorter
format to the longer. If you are only adding fields and methods in a
reasonably compatible way, you can control the compatibility by
providing a long int
named
serialVersionUID
. The initial value should be obtained from ...
Get Java Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.