gpt4 book ai didi

java - 序列化 - 需要手动定义 SerialVersionUID?

转载 作者:行者123 更新时间:2023-12-01 22:41:57 25 4
gpt4 key购买 nike

我目前正在尝试证明删除 findbugs/sonar 中分类使类可序列化的规则是合理的,或者在大多数情况下,扩展我们的基类,使类在开发人员没有意识到的情况下可序列化,然后不定义SerialVersionUID 严重错误!这当然会让我们的麻瓜管理层(读取非开发人员的管理层)感到 panic ,认为我们有必须修复的严重错误!

我的观点是,在当前版本的 Java 中,您不需要提供 SerialVersionUID,因为在序列化类的情况下 JVM 会为您执行此操作,但在当今时代,任何人都可以指出任何原因吗?我们仍然应该自己提供 UID 而不是把它留给 JVM?在网络上查看,我现在能找到的提供 UID 的唯一理由是,不这样做是“不好的做法”。

有什么想法吗?

最佳答案

SerialVersionUID 用于检查用于序列化和反序列化的类的版本在不同 JVM 中是否相同。Serialized Runtime 生成的默认值对类详细信息敏感。因此,尽管跨不同 JVM 加载的类可能是兼容的,但您仍然可能会得到错误的 InvalidClassException 。

检查 Javadoc:-

序列化运行时与每个可序列化类关联一个版本号,称为serialVersionUID,在反序列化过程中使用它来验证序列化对象的发送者和接收者是否已为该对象加载了与以下方面兼容的类:序列化。如果接收方加载的对象类与相应发送方的类具有不同的serialVersionUID,则反序列化将导致 InvalidClassException。可序列化类可以通过声明名为“serialVersionUID”的字段来显式声明自己的serialVersionUID,该字段必须是静态的、最终的且类型为long:

*ANY-ACCESS-MODIFIER 静态最终长serialVersionUID = 42L;

如果可序列化类未显式声明serialVersionUID,则序列化运行时将根据该类的各个方面计算该类的默认serialVersionUID 值,如Java(TM) 对象序列化规范中所述。但是,强烈建议所有可序列化类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类详细信息高度敏感,这些详细信息可能因编译器实现而异,因此可能会在反序列化期间导致意外的InvalidClassExceptions。因此,为了保证在不同的 java 编译器实现之间具有一致的serialVersionUID 值,可序列化类必须声明显式的serialVersionUID 值。还强烈建议显式的serialVersionUID声明尽可能使用private修饰符,因为此类声明仅适用于立即声明的类——serialVersionUID字段作为继承成员没有用处。数组类无法声明显式的serialVersionUID,因此它们始终具有默认的计算值,但数组类不需要匹配serialVersionUID值。*

关于java - 序列化 - 需要手动定义 SerialVersionUID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25998312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com