java规范说:“强烈建议所有可序列化的类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类详细信息非常敏感,可能因编译器实现而异”
有人可以深入研究这个吗? getSerialVersionUID()方法进行反射,并且通常在任何地方都使用反射,那么编译器依赖什么呢?
答案 0 :(得分:1)
J. Bloch的书“Effective Java”中给出了对这个问题的精彩解释:
“第74项:明智地实施Serializable”:
如果未通过声明静态来明确指定此数字 最终长字段名为serialVersionUID,系统自动生成 通过将复杂的过程应用于类来在运行时生成它。 自动生成的值受类名称的影响 它实现的接口的名称,以及它的所有公共和 受保护的成员如果你以任何方式更改任何这些东西,为 例如,通过添加一个简单方便的方法,自动进行 生成的串行版本UID更改
UPD :我在评论中也被问过,为什么它是编译器相关的。实际上这里的编译器依赖不是关于getSerialVersionUID()
算法本身(方法在运行时被调用,当然),但是它是如何描述类本身的。例如,可以在编译时将一些合成方法添加到类中,这也将在SUID中计算。有关详细信息,请查看方法ObjectStreamClass.computeDefaultSUID()
,它的作用以及如何计算默认SUID。