为什么serialVersionUID字段存在?

nik*_*pen 3 java serializable serialversionuid aspects

它让我从Serializable界面的启动中感到困惑,为什么我必须在我的所有课程中加入这个领域.我知道这个接口需要一个唯一的标识符来标记类,但为什么它们不能在运行时生成它.例如,他们可以使用完全限定类名的MD5哈希或者用于处理罕见事件中的重复项的类似方法来生成它(也就是说,我确定,当被要求生成id时,eclipse会做什么).

所以我要问的是(这篇文章不仅仅是对标准库的咆哮)究竟是如何使用框架化序列化字段的?

我想知道的原因是因为我将尝试创建一个Aspect(使用AspectJ或其他语言),它将使用MD5哈希添加serialVersionUID字段,并且能够以API可接受的方式处理冲突.

如果我能让它发挥作用,我会发布结果.

Ste*_*Kuo 9

没有要求拥有该serialVersionUID领域.如果您不提供,Java将根据您的类的字段和方法生成一个.

您可能希望指定的原因serialVersionUID是为了防止在更改方法时更改值,这不会影响序列化二进制文件.考虑班级:

public class Person implements Serializable {
    private String name;
    public String getName() {
        return name;
    }
}
Run Code Online (Sandbox Code Playgroud)

没有serialVersionUID指定.如果你运行serialver Person它返回:

Person:    static final long serialVersionUID = 3793453319058452486L;
Run Code Online (Sandbox Code Playgroud)

现在您决定添加一个方法,但保持字段相同.

public class Person implements Serializable {
    private String name;
    public String getName() {
        return name;
    }
    public Object foo() {
        return "bar";
    }
}
Run Code Online (Sandbox Code Playgroud)

序列化二进制文件仍与旧版本完全兼容,但serialVersionUID不同:

Person:    static final long serialVersionUID = -6188734029437600310L;
Run Code Online (Sandbox Code Playgroud)

使用不同的serialVersionUID反序列化将导致serialVersionUID不匹配错误.解决方法是serialVersionUID通过将其设置为任何值(我设置它1L)并在字段更改时更改它来声明您自己的.

另请参阅此相关问题"什么是serialVersionUID以及我为什么要使用它?" 有关更详细的讨论.

  • 您可能会强调,该值不需要以任何形式或形式独特. (2认同)