Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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 为什么jvm生成serialVersionUID?_Java_Jakarta Ee - Fatal编程技术网

Java 为什么jvm生成serialVersionUID?

Java 为什么jvm生成serialVersionUID?,java,jakarta-ee,Java,Jakarta Ee,根据: 序列化运行时将一个版本号(称为serialVersionUID)与每个可序列化类关联,该版本号在反序列化期间用于验证序列化对象的发送方和接收方是否为该对象加载了与序列化兼容的类 如果serialVersionUID仅用于验证序列化对象的发送方和接收方是否为该对象加载了类,那么jvm就不能使用类名本身进行验证。您错过了引用的后半部分,其中指出: 与序列化兼容的 如果希望序列化类对象具有多个版本,则需要可以更改的标识符。您不能仅仅通过传入类名来实现这一点 打个比方,这有点像在说为什么我们需要

根据:

序列化运行时将一个版本号(称为serialVersionUID)与每个可序列化类关联,该版本号在反序列化期间用于验证序列化对象的发送方和接收方是否为该对象加载了与序列化兼容的类


如果serialVersionUID仅用于验证序列化对象的发送方和接收方是否为该对象加载了类,那么jvm就不能使用类名本身进行验证。

您错过了引用的后半部分,其中指出:

与序列化兼容的

如果希望序列化类对象具有多个版本,则需要可以更改的标识符。您不能仅仅通过传入类名来实现这一点


打个比方,这有点像在说为什么我们需要传递HTTP版本HTTP/1.1,因为它最终是HTTP。这取决于协议版本以及协议本身。

好吧,要理解可序列化类及其serialVersionUID的概念,最好的方法是阅读其完整的java文档,并用适当的示例进行解释


你的问题似乎是关于这个话题的一次恰当而成熟的讨论的重复。希望这能有所帮助。

先生,看来讨论的是为什么要使用SerialVersionUID。如果您不介意的话,请您从成熟的讨论中复制特定部分,这正好回答了我的问题,即为什么jvm生成serialVersionUID,而不是使用类名本身进行验证。Doc声明serialVersionUID必须是静态的、最终的,并且类型为long,即类级别常量。在运行时,加载的类名无论如何都是唯一的,那么为什么jvm不能使用类名作为id,只要基本目的是验证序列化对象的发送方和接收方是否为该对象加载了类。当然我遗漏了一些东西。@cooper:想想一个不断发展的类/模式。您可以继续从类中添加/删除字段。为了跟踪这些更改,您可以不断增加版本id。当序列化数据被发送时,接收方将检查版本和类类型;如果类类型匹配但版本不匹配,则反序列化不起作用。当您创建RMI这样的服务时,这一点变得非常重要,在RMI中,序列化的类对象在客户端和服务器之间交换,客户端和服务器处理相同的逻辑模式非常重要。真的,先生。Nice Usecase.JVM考虑类的所有成员,可能还有jvmVersion&OS,生成UID时。但Doc不声明/建议使用UID跟踪对类结构所做的更改。它声明强烈建议所有可序列化类显式声明UID值,因为默认UID计算对类细节高度敏感,这些细节可能因编译器实现而异,似乎我们明确地添加了补丁。理论上,通过UID跟踪不断发展的类结构是可以理解的,需要考虑到有多方便/可行practically@cooper:您质疑这些ID的有用性是正确的。我在过去创建过RMI服务,但是考虑到我们的客户机版本与服务器版本完全同步,所以根本不需要修改版本ID。我可以想象,如果您公开大量第三方客户机使用的RMI服务,并且您必须绝对确保每个人都使用相同的类版本,那么这个概念可能会派上用场。所以,是的,不总是有用的,但漂亮的功能,如果需要的话。