将类的哈希码用作serialVersionUID是否明智?

Ric*_*arn 2 java serialization

我注意到在我公司的代码库中,一种常见的模式是将serialVersionUID一个类的设置为该类的哈希码,如下所示:

public final class ClassName implements Serializable {

    private static final long serialVersionUID = ClassName.class.hashCode();

    [...]

}
Run Code Online (Sandbox Code Playgroud)

这是设置班级的有效方法serialVersionUID吗?

Joa*_*uer 6

Class没有明确定义的hashCode()方法,因此没有被定义为稳定的。

这意味着,你可以(而且可能会)得到不同的结果为MyClass.class.hashCode()不同的过程之间,甚至在同一JVM和绝对不同的JVM实现和/或版本之间。

这意味着来自任何一个JVM的序列化数据可能只能在同一JVM中使用。

现在,可以将其用作避免将序列化用于跨VM通信的有意方式(它不是“安全机制”或类似的东西,但是可以用来快速检测将序列化用于跨VM通信的尝试。 )。但是,如果这是目标,那么使用随机数进行平坦处理可能会更好。