这个问题与以下问题完全相同:
为什么生成长serialVersionUID而不是简单的1L? https://stackoverflow.com/questions/888335/why-generate-long-serialversionuid
具有讽刺意味的是,迈克尔·博格斯瓦特也回答了这个问题。
迈克尔·博格斯沃特 https://stackoverflow.com/questions/1373215/can-netbeans-generate-an-automatic-serial-version-id-for-a-java-class/1373293#1373293生成serialVersionUID的答案让我思考。是否有任何理由生成像 eclipse 和 IDEA 这样的正确的serialVersionUID(或者只是普通的serialver)?还是插上1L也一样好?
一旦你在其中写入了一个数字(任何数字),当你对类进行破坏兼容性的更改时,你就有责任修改它(例如,更改 JavaDoc 不会破坏它,添加属性肯定会破坏它)。
如果您避免指定serialVersionUID
, javac
会放一些独特的东西,比如类的哈希值。
什么时候重要?当您将内容序列化到磁盘并希望稍后使用不同版本的程序加载它时。
或者当两个可能具有不同版本的实例需要通过线路交换序列化数据时。
如果您不使用实际的序列化并且您的类是Serializable
只是因为它继承了该接口,然后避免了serialVersionUID
是最简单、最安全的事情。如果您进行序列化但实际上不需要与过去兼容,则同样,在这种情况下,避免该值是最安全的做法。
另一方面,如果您需要加载过去修订版生成的内容(无论是远程还是您自己,从磁盘上长期遗忘的文件中),那么您需要拥有该值,并在(并且仅当)您确实破坏了兼容性。
在第二条评论后添加(罗宾):
没有回答实际问题。
呃,对。我想这是一个:不,据我所知,实际数字没有任何意义,它只需要与以前的所有先前值不同,当它不再与它们兼容时。
另外,您应该始终为可序列化的类声明一个serialVersionUID
作为一般建议,我认为避免它是一个更好的解决方案:大多数时候你不需要与不同供应商的 JVM 进行交互,你不需要对很久以前的数据进行反序列化或者实际上需要兼容性检查,大多数时候序列化对象的生命周期非常短暂。
当然,对于不同的项目,当你do have长期存在的序列化对象,那么,您必须承担定义这些 UID 并正确维护它们的负担。
但是,由于缺少 UID 意味着“快速失败,捕获错误”,而使用 1L(或任何其他常量)通常意味着“类发生变化,你不记得更新它,稍后会出现问题”,那么作为一般建议,我认为第一个是更好的默认值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)