为什么Java编译器会创建serialVersionUID合成字段?

时间:2011-09-12 14:17:51

标签: java field serialversionuid synthetic

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

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

更新

事实上,还创建了$VRc合成字段。

2 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:1)

此字段对于Java serialization至关重要。简而言之:它允许JVM发现序列化的类(例如保存在磁盘上)之后已被更改,并且无法安全地反序列化回对象。

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

更新:刚刚注意到您的课程没有实施Serializable。您确定没有超类或已实现的接口没有扩展Serializable吗?