作为调试应用程序的一部分,我注意到Field.getDeclaredFields()
返回一些合成字段,包括扩展接口的类中的serialVersionUID
字段,尽管没有扩展Serializable
。
为什么编译器会添加这样的字段?
更新
事实上,还创建了$VRc
合成字段。
答案 0 :(得分:11)
Java编译器/运行时不会自动创建serialVersionUID字段。我怀疑您正在使用某种形式的字节码增强框架,该框架被指示在运行时或编译期间添加合成字段。
$VRc
字段由Emma检测框架生成,因此这将是至少一个合成字段的原因。
当serialVersionUID
属性设置为true时,instr.do_suid_compensation
字段也是added by Emma。
答案 1 :(得分:1)
此字段对于Java serialization至关重要。简而言之:它允许JVM发现序列化的类(例如保存在磁盘上)之后已被更改,并且无法安全地反序列化回对象。
查看上面引用的文档中的版本控制章节,它解释了如何使用serialVersionUID
。
更新:刚刚注意到您的课程没有实施Serializable
。您确定没有超类或已实现的接口没有扩展Serializable
吗?