【问题标题】:Why would the Java compiler create a serialVersionUID synthetic field?为什么 Java 编译器会创建一个 serialVersionUID 合成字段?
【发布时间】:2011-11-15 09:39:46
【问题描述】:

作为调试应用程序的一部分,我注意到 Field.getDeclaredFields() 返回一些合成字段,包括扩展接口的类中的 serialVersionUID 字段,尽管没有扩展 Serializable

编译器为什么要添加这样的字段?

更新

其实还创建了一个$VRc合成字段。

【问题讨论】:

  • 你使用的是哪个编译器?

标签: java field serialversionuid synthetic


【解决方案1】:

此字段对于 Java serialization 是必不可少的。简而言之:它允许 JVM 发现被序列化的类(例如,保存在磁盘上)后来被更改,无法安全地反序列化回对象。

查看上面引用的文档中的版本控制一章,它解释了如何使用serialVersionUID

更新:刚刚注意到您的课程没有实现Serializable。你确定没有一个超类或实现的接口没有扩展Serializable

【讨论】:

  • 我认为问题更多是关于当继承层次结构中没有任何类实现Serializable接口时为什么要添加该字段,而不是该字段的目的是什么。
  • 是的,100% 确定。它类似于 A 类实现 B 和 B 被声明为接口。 A 和 B 本身不声明任何字段。就是这样..(不,这与串行版本 UID 的含义/使用无关)
【解决方案2】:

Java 编译器/运行时不会自动创建 serialVersionUID 字段。我怀疑您正在使用某种形式的字节码增强框架,该框架被指示在运行时或编译期间添加合成字段。

$VRc 字段由 Emma 检测框架生成,因此这将是至少一个合成字段的原因。

instr.do_suid_compensation 属性设置为true 时,serialVersionUID 字段也是added by Emma

【讨论】:

  • 你说得对,我确实在使用 Emma 进行测试覆盖。当我停用它时,这些字段不再存在。
  • 是的,如果设置了某个属性,即使是serialVersionUID也是generated by Emma
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 2013-03-26
  • 2011-11-06
相关资源
最近更新 更多