Java 使用类的哈希代码作为其serialVersionUID是否合理?
我注意到,在我公司的代码库中,一种常见的模式是将类的Java 使用类的哈希代码作为其serialVersionUID是否合理?,java,serialization,Java,Serialization,我注意到,在我公司的代码库中,一种常见的模式是将类的serialVersionUID设置为该类的哈希代码,如下所示: public final class ClassName implements Serializable { private static final long serialVersionUID = ClassName.class.hashCode(); [...] } 这是设置类“serialVersionUID”的有效方法吗?没有明确定义的hashCo
serialVersionUID
设置为该类的哈希代码,如下所示:
public final class ClassName implements Serializable {
private static final long serialVersionUID = ClassName.class.hashCode();
[...]
}
这是设置类“serialVersionUID
”的有效方法吗?没有明确定义的hashCode()
方法,因此它没有定义为稳定的
这意味着您可以(也可能会)在不同的运行之间获得不同的结果,即使是在同一个JVM上,而且肯定是在不同的JVM实现和/或版本之间
这意味着来自任何一个JVM的序列化数据可能只能在同一个JVM中使用
现在,这可能是一种有意避免跨VM通信使用序列化的方法(它不是“安全机制”或类似的东西,但可以用于快速检测跨VM通信使用序列化的尝试)。但是如果这就是目标,那么直接使用随机数可能更好。这是一个可怕的想法。关于如何计算
hashCode
有多种策略(Class::hashCode
isObject::hashCode
)。在java-8中,默认值是Marsaglia XOR Shift,这是一个伪随机生成器,它将为您生成一个int
;但这可能会在不同的虚拟机之间发生变化,而且有多种方法可以从同一个版本中进行更改,有关详细信息,请参阅 实际上,Class.hashCode()
实际上是Object.hashCode()
,所以它取决于类所在的内存位置。也就是说,你可能意识到这实际上不是一个好的使用价值,因为它可能会在不同的运行中有所不同。但是,由于旧的序列化机制已被弃用,因此您也可以不再使用serialVersionUID
(或使用一些默认值)。IDE插件可帮助您生成serialVersionUID
。例如IntelliJ@Thomas:“hashCode在某个时间点可能会实现,也可能不会实现为对象内存地址的某个函数。”,emphasis mine。