1

java规范说:“强烈建议所有可序列化的类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类细节高度敏感,可能因编译器实现而异”

请问有人可以深入研究吗?getSerialVersionUID() 方法是做反射的,反射无处不在,那么什么是编译器依赖呢?

4

1 回答 1

1

J. Bloch 的书“Effective Java”中给出了这个问题的精彩解释:

《第74条:明智地实现Serializable》:

如果您没有通过声明名为 serialVersionUID 的静态最终长字段来显式指定此数字,系统会在运行时通过将复杂过程应用于类来自动生成它。自动生成的值受类的名称、它实现的接口的名称以及它的所有公共和受保护成员的影响。如果您以任何方式更改这些内容中的任何一项,例如,通过添加一个简单的便捷方法,自动生成的串行版本 UID 会更改

UPD:我还在评论中被问到,为什么它依赖于编译器。实际上,这里的编译器依赖性与getSerialVersionUID()算法本身无关(当然,方法是在运行时调用的),而是与类本身的描述方式有关。例如,可以在编译时将一些合成方法添加到类中,这些方法也将计入 SUID。有关详细信息,请查看 method ObjectStreamClass.computeDefaultSUID(),它的作用以及如何计算默认 SUID。

于 2016-12-07T15:08:50.130 回答