在Java中扩展Serializable类时,是否为serialVersionUIDselect了什么?

我正在扩展一个实现Serializable接口的类(ArrayBlockingQueue)。 Sun的文档(和我的IDE)build议我应该设置这个值来防止恶作剧:

但是,强烈build议所有可序列化的类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类详细信息高度敏感,这些类可能因编译器实现而异,因此在反序列化期间可能会导致意外的InvalidClassException。

现在,我不在乎什么价值放在那里。 有关系吗?

没有 – 只要你在正确的时间改变它(即当你做一个影响序列化的改变,例如删除一个字段),你应该使用什么值。

为了简单起见,我build议从0开始,每次需要时增加1。

序列化规范有更多的细节。

对于serialVersionUID唯一重要的是该类的二进制兼容序列化版本具有相同的serialVersionUID; 也就是说,如果您没有对该类的序列化表单做任何重大更改,那就没问题了。

当然,更好的select是使用序列化提供给您的高级选项,这样就不会有任何重大更改。 我build议阅读readResolve()等。 有效的Java涵盖了这个领域的一些棘手的问题。