【问题标题】:Is Java SerialVersionUid of 1L ok? Or does it need to be unique?1L 的 Java SerialVersionUid 可以吗?还是需要独一无二?
【发布时间】:2015-08-23 09:09:00
【问题描述】:

我有两个实现 Serializable 的 java 类。我将它们都设置为 1L 的 serialVersionUid。

一位同事说,所有类都必须有一个唯一的序列版本 uid,如果类具有相同的序列版本 uid,jvm 会将它们视为平等的。我认为相等是基于 equals 方法的结果,而不是序列版本 uid。

据我了解,串行版本 uid 用于指示类的版本,并且当类以不兼容的方式更改时,串行版本 uid 应递增。

正确吗?可以使用 1 的 serialversion uid 吗?或者java类不应该有1L的serialversion uid?

【问题讨论】:

  • 区别在于我特别想知道1L是否是可接受的串行版本uid(而不是是否需要serialverionuid)。也许我的问题的另一种说法是“串行版本的 uid 是否需要是唯一的?”
  • 您是否尝试过阅读这些答案?我向您保证,如果您阅读了该主题,您的问题将会得到解答。
  • 好吧,与我一起工作的另一个人读到的答案表示 1L 不是允许的值,我读到它表明它是。
  • '和你一起工作的另一个人'正在做梦。那里没有说1L 是非法值。那里只有一个答案甚至提到了它。 serialVersionUIDlong, 并且允许 任何 值。

标签: java serialization serialversionuid


【解决方案1】:

类名是对象序列化表示的一部分。 serialVersionUID 仅用于对类进行版本控制。所以 1L 是一个有效值。

注意,如果你不打算在进化类的同时保持序列化的兼容性,serialVersionUID 是没有用的,你可以省略它。当您想要对类进行兼容更改并且仍然能够读取使用该类的旧版本序列化的对象(反之亦然)时,拥有 serialVersionUID 很有用。但这需要格外小心,而且绝非易事。您通常应避免将序列化用于长期存储。如果用于网络目的,对客户端和服务器使用完全相同的类(即同时部署两者)是最简单的策略。

还请注意,您可以通过简单地序列化和反序列化两个具有与 serialVersionUID 相同值 (1L) 的不同类的两个对象来轻松证明您的同事是错误的。如果他的理论是正确的,JVM 将无法知道如何反序列化对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2011-08-18
    • 2012-10-08
    • 2010-10-27
    相关资源
    最近更新 更多