为什么依赖ObjectStreamClass.getSerialVersionUID是不安全的?

时间:2016-12-07 15:05:27

标签: java reflection serialversionuid

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

有人可以深入研究这个吗? getSerialVersionUID()方法进行反射,并且通常在任何地方都使用反射,那么编译器依赖什么呢?

1 个答案:

答案 0 :(得分:1)

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

“第74项:明智地实施Serializable”:

  

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

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