java - 为什么依赖 ObjectStreamClass.getSerialVersionUID 不安全?

标签 java reflection serialversionuid

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

请问有人可以深入研究一下吗? getSerialVersionUID()方法进行了反射,并且反射在任何地方都常用,那么什么是编译器相关的?

最佳答案

J. Bloch 的书《Effective Java》对此问题给出了精彩的解释:

“第 74 项:明智地实现可序列化”:

If you do not specify this number explicitly by declaring a static final long field named serialVersionUID, the system automatically generates it at runtime by applying a complex procedure to the class. The automatically generated value is affected by the class’s name, the names of the interfaces it implements, and all of its public and protected members. If you change any of these things in any way, for example, by adding a trivial convenience method, the automatically generated serial version UID changes

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

关于java - 为什么依赖 ObjectStreamClass.getSerialVersionUID 不安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41020845/

相关文章:

java - Spring MVC Ajax POST

java - 让子类序列化为父类(super class)的实例?

java - 从 Spring 上下文访问 Spring 测试类对象

scala 类序列化,无法修复 SerialVersionUID

java - 为什么生成 long serialVersionUID 而不是简单的 1L?

java - Ignite AtomicSequence - 重置sequenceName值

java - 如何访问 Deadbolt2 处理程序中的用户 session

c# - 如何知道 PropertyInfo 是否是一个集合

c# - 获取给定名称的属性的默认值

java - 序列化 lambda 而没有 serialVersionUID?