java – 为什么serialVersionUID字段存在?
它让我对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?”以获得更详细的讨论. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |