Re: Automating class serial version numbers
Simon Brooke wrote:
[me:]
In general you want the serialVersionUID to stay the same as the class
evolves -- the only time when it should change is when you have made a
change to the object's structure which the serialisation mechanism can't
cope with by
itself. So it's the programmer who should be making such changes, as a
very conscious (and very public, since it will typically affect other
code) decision.
Yup, which is why I want it to get it set from PROJECT_VERSION, which will
change only on API updates. But when the API does change, I'd like all the
serialVersionUIDs to change rather than to have to manually edit currently
245 source files in one project, and 177 in another.
I'm still not sure that we are thinking about this in the same way. As a very
silly example,
class Temperature
{
private double degrees;
public double getDegrees() { return degrees; }
// etc
}
changing that to:
class Temperature
{
private double degrees;
/**@deprecated*/ public double getDegrees() { return
getDegreesCentrigrade(); }
public double getDegreesCentrigrade() { return degrees; }
public double getDegreesFahrenheiht() { return degrees*9.0/5.0+32.0; }
// etc
}
would be a major API change, but does not break serialisation. OTOH, changing
the original to:
class Temperature
{
private double degreesFahrenheiht;
public double getDegrees() { return (degreesFahrenheiht-32)*5.0/9.0; }
// etc
}
is no API change at all, but /does/ break serialisation.
The only scenario I can think of which respects those facts is if, as Andy has
suggested, you don't ever have serialised objects hanging around at all (maybe
you only use it for RMI, perhaps). But in that case, there doesn't seem to be
a lot of point to defining serialVersionUID in the first place. But if you do
need it, then it seems simplest just to have in each serialisable class:
package my.company;
import my.company.ProductIDs;
class SomeClassOrOther
implements Serializable
{
public static final long serialVersionUID
= ProductIDs.PRODUCT_VERSION_NUMBER;
//...
}
and let javac do the work for you...
-- chris