我注意到在我公司的代码库中,常见的模式是将类的serialVersionUID
设置为该类的哈希码,如下所示:
public final class ClassName implements Serializable {
private static final long serialVersionUID = ClassName.class.hashCode();
[...]
}
这是设置类的serialVersionUID
的有效方法吗?
答案 0 :(得分:6)
Class
没有明确定义的hashCode()
方法,因此它不是稳定的。
这意味着您可以(而且很可能)在不同的运行之间获得MyClass.class.hashCode()
的不同结果,即使在相同的JVM上,也可以确定地在不同的JVM实现和/或版本之间。< / p>
这意味着来自任何一个JVM的序列化数据可能只能在同一JVM中使用。
现在,可能被用作避免跨虚拟机通信使用序列化的有意方式(它不是“安全机制”或类似的东西,但可以用来快速检测使用序列化进行跨VM通信的尝试)。但是,如果这是目标,那么使用随机数进行平坦处理可能会更好。
答案 1 :(得分:3)
这是一个可怕的想法。如何计算hashCode
(Class::hashCode
是Object::hashCode
)有多种策略。在java-8下,默认值为Marsaglia-XOR-Shift,这是一个伪随机生成器,它将为您提供int
;但这可能会因VM的不同而有所变化,并且也有多种方法可以从同一版本进行更改,有关详细信息,请参见this answer。