【问题标题】:Should serialVersionUID be unique for different classes?serialVersionUID 对于不同的类应该是唯一的吗?
【发布时间】:2014-02-06 13:19:57
【问题描述】:
class A implements Serializable{
    private static final long serialVersionUID = 5L;
    ...
}

class B implements Serializable{
    private static final long serialVersionUID = 6L;
    ...
}

那么有必要为这两个类赋予唯一的serialVersionUID

那么我可以为这两个课程分配serialVersionUID = 5L 吗?

我阅读了以下链接

Why generate long serialVersionUID instead of a simple 1L?

What is a serialVersionUID and why should I use it?

【问题讨论】:

    标签: java serialization


    【解决方案1】:

    serialVersionUID 可以是任何东西。

    但最佳做法是从最小的数字开始(例如0L),并在您对影响序列化的类进行更改时更新它,例如,添加/更新/删除字段,在这种情况下,您应该将版本号从 0L 增加到 1L 等等。

    【讨论】:

    • @Reman Sahasi,“添加/更新/删除字段,在这种情况下,您应该将版本号从 0L 增加到 1L 等等。” - 如果我们将 0L 更新为 1L,那么我们应该如何获取先前序列化的对象?由于之前序列化的对象是用 0L 存储的。
    • @Raj 为什么 you 想要获取以前序列化的对象?这个属性基本上是在序列化过程中用来验证加载的类和序列化的对象是否兼容。
    • @Reman Sahasi,让我们假设,如果您使用 0L serialVersionUId 的序列化将一个对象保存在文件中,那么稍后您将几列添加到类中(即修改了类/删除了字段)并更新了 serialVersionUID 0L 到 1L 然后您将 1L 的最新数据保存到文件中。那么在这个文件中,如果你有两个版本的序列化对象,那么我们如何才能获得以前存储的具有相同序列化类的 0L 数据?
    【解决方案2】:

    SerialVersionUUID 是编译器用来序列化/反序列化对象的标识符。此 id 是该类的私有成员。

    为每个可序列化创建新的 uuid 可以很好地控制序列化/反序列化过程,但它不需要在不同的类中是唯一的。

    【讨论】:

      【解决方案3】:

      是的,你可以。不同类的串行版本相互独立,互不干扰。

      PS
      Eclipse 甚至建议您将serialVersionID 设置为默认值1L

      【讨论】:

        【解决方案4】:

        serialVersionUID 需要记住类的版本。序列化和反序列化时应该相同。提供这个值而不是 JVM 分配一个值(通常是散列)是一种很好的编程实践。两个类不必具有唯一值。

        【讨论】:

        • 我想知道“它对于单个类应该是唯一的,但对于两个不同的类可能是相同的”
        • @Aniket 你能解释一下这条线吗? “两个类没有必要具有唯一值”
        • 这意味着两个不同的类可以有相同的serialVersionUID值。
        猜你喜欢
        • 2010-10-27
        • 1970-01-01
        • 2018-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-23
        • 1970-01-01
        相关资源
        最近更新 更多