加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 为什么serialVersionUID字段存在?

发布时间:2020-12-15 05:09:23 所属栏目:Java 来源:网络整理
导读:它让我对Serializable接口的推出感到困惑,为什么我必须将这个字段合并到我的所有类中.我知道这个接口需要一个唯一的标识符来标记类,但为什么它们不能在运行时生成它.例如,他们可以使用完全限定类名的MD5哈希或者用于处理罕见事件中的重复项的类似方法来生成
它让我对Serializable接口的推出感到困惑,为什么我必须将这个字段合并到我的所有类中.我知道这个接口需要一个唯一的标识符来标记类,但为什么它们不能在运行时生成它.例如,他们可以使用完全限定类名的MD5哈希或者用于处理罕见事件中的重复项的类似方法来生成它(也就是说,我确定,当被要求生成id时,eclipse会做什么).

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

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

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

解决方法

不需要具有serialVersionUID字段.如果您不提供,Java将根据您的类的字段和方法生成一个.

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

public class Person implements Serializable {
    private String name;
    public String getName() {
        return name;
    }
}

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

Person:    static final long serialVersionUID = 3793453319058452486L;

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

public class Person implements Serializable {
    private String name;
    public String getName() {
        return name;
    }
    public Object foo() {
        return "bar";
    }
}

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

Person:    static final long serialVersionUID = -6188734029437600310L;

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

另请参阅此related question “What is a serialVersionUID and why should I use it?”以获得更详细的讨论.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读