Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用类的哈希代码作为其serialVersionUID是否合理?_Java_Serialization - Fatal编程技术网

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
is
Object::hashCode
)。在java-8中,默认值是Marsaglia XOR Shift,这是一个伪随机生成器,它将为您生成一个
int
;但这可能会在不同的虚拟机之间发生变化,而且有多种方法可以从同一个版本中进行更改,有关详细信息,请参阅

实际上,
Class.hashCode()
实际上是
Object.hashCode()
,所以它取决于类所在的内存位置。也就是说,你可能意识到这实际上不是一个好的使用价值,因为它可能会在不同的运行中有所不同。但是,由于旧的序列化机制已被弃用,因此您也可以不再使用
serialVersionUID
(或使用一些默认值)。IDE插件可帮助您生成
serialVersionUID
。例如IntelliJ@Thomas:“hashCode在某个时间点可能会实现,也可能不会实现为对象内存地址的某个函数。”,emphasis mine。