java中的serialVersionUID是啥,通常在异常类中? [复制]

Posted

技术标签:

【中文标题】java中的serialVersionUID是啥,通常在异常类中? [复制]【英文标题】:What is serialVersionUID in java, normally in exception class? [duplicate]java中的serialVersionUID是什么,通常在异常类中? [复制] 【发布时间】:2011-11-03 11:27:28 【问题描述】:

可能重复:Why should I bother about serialVersionUID?

我正在查看一些异常处理代码,我看到了一些名为 serialVersionUID 的东西。这个uid是干什么用的??是只限例外还是全班都可以用???这个id有什么好处???

【问题讨论】:

见这里:***.com/questions/285793/… 恕我直言,这是一个很好的、精心设计的问题,但在上面的链接中已经(大部分)得到了回答。至于是否仅限于Exception,答案是否定的,可以在任何类中使用。 在我们没有可序列化的异常中......那为什么它在那里??? @amod0017 java.lang.Exception 实现了 Serializable,因此任何子类也将实现 Serializable。 感谢汤姆提供的信息。 【参考方案1】:

serialVersionUID 是一个定义特定类版本的字段,而 seriializingdeseriializing.. 考虑一个场景,您有一个类 Employee,它有 3 个字段,已经投入生产一段时间(意味着可能存在许多员工对象的序列化版本),当您更新类以包含(例如第 4 个字段)时,所有先前的类(已序列化)都不能转换或反序列化为新的类&你'会出现异常。

为避免此问题,您可以使用serialVersionUID 字段告诉JVM,新类实际上是不同的版本(通过更改serialVersionUID)。

@Farmor & @Tom Jefferys 说的差不多,但举个例子,事情看起来要简单得多。

【讨论】:

很好解释。并为示例 +1。 serialVersionUID 如何完全避免这个问题? 反序列化java时只能反序列化非易失性非常量(非final)字段。由于serialVersionUID 既是静态的又是最终的,反序列化将失败,因为类定义中的字段值与序列化对象中的值不匹配。这样,JVM 可以抛出异常,而不是部分反序列化(或混合)对象。 您没有将它与“为什么它通常存在于异常类中。”联系起来。你应该回答整个问题。【参考方案2】:

用于序列化,应该在任何实现Serializable的类中声明。

它实际上是 JVM 可以用来检查序列化类是否与您尝试将其反序列化成的类定义匹配的版本号。

这里有更多信息:http://download.oracle.com/javase/1,5.0/docs/api/java/io/Serializable.html

【讨论】:

【参考方案3】:

判断它们是否具有可序列化和可反序列化的兼容性,如果它们具有相同的serialVersionUID,并且都实现了Serializable,那么它们是兼容的。

而且它不仅限于例外,因为您会注意到,如果 Eclipse 实现了Serializable,它很容易在您的普通 java 类的早期放置一个 serialVersionUID

已编辑:更新后包含@Spychos 对Serializable 接口的正确评论。

【讨论】:

这并不完全正确。如果一个对象或其超类之一实现了可序列化,则该对象是可序列化的。

以上是关于java中的serialVersionUID是啥,通常在异常类中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

跨不同 JVM 的 Java 标准库中的 SerialVersionUID

为啥java中的serialVersionUID必须是静态的、最终的和long类型的? [复制]

Java序列化中的SerialVersionUid

跨越不同JVM的Java标准库中的SerialVersionUID

java 实现serialVersionUID

Java 中的 serialVersionUID 是用来干什么的