显式串行版本UID 被认为是有害的?

2022-09-01 19:03:59

在我看来,为新类显式指定串行VersionUID是不好的。考虑两种情况,即布局应该更改它时不更改它,并在不应该更改它时更改它。

在应该更改的时间不更改几乎仅在显式时才发生。在这种情况下,它会导致一些非常微妙,难以找到的错误。特别是在开发过程中,当类布局经常更改时。但是,如果没有显式指定它,它将发生变化,反序列化将大声中断,这很可能通过清除存储库来解决。

在不应该有的时候更改它几乎只会在它是隐式的时候发生。这是类布局已更改但仍希望从旧的序列化 blob 反序列化的罕见情况。这可能会在 QA 期间被捕获(从 5.2 升级到 5.2.1 后出现奇怪的错误,请参阅附加的堆栈跟踪),并且可以通过设置显式值来轻松修复。

评论?


答案 1

更改不应发生的时间可能会由于类布局更改以外的原因而发生 - 问题在于它依赖于编译器实现。如果您使用 Eclipse 进行调试,但使用 javac 进行生产构建,则最终可能会得到两组不兼容的数据集。


答案 2

在我的工作中,我们明确禁止指定serialVersionUID,正是因为你提出的问题。

此外,我们保留的类仅用于存储内部没有逻辑的数据,因此它们更改的唯一方式是因为更改了数据成员。