0

我目前正在编写一个项目,其中有一个可序列化的类 ClientRepository。该类不指定任何se​​rialVersionUID。当我尝试运行我的程序时,出现以下异常:

Exception in thread "main" java.io.InvalidClassException: ClientRepository; local class incompatible: stream classdesc serialVersionUID = -477189107700903771, local class serialVersionUID = -3576242897222506440

所以我添加了一个默认的serialVersionUID(1L),但现在我得到了

Exception in thread "main" java.io.InvalidClassException: ClientRepository; local class incompatible: stream classdesc serialVersionUID = -477189107700903771, local class serialVersionUID = 1

如何将“stream classdesc serialVersionUID”更改为 1L,这样才不会冲突?

谢谢!

4

2 回答 2

3

不要尝试更改数据- 相反,如果您确定您的类仍然与旧版本兼容(并且如果只有一个版本具有野外数据),请将您的声明更改serialVersionUID为 -477189107700903771L 以匹配该值在数据中。该值是任意的 - 它只需要匹配数据中的内容。

当然,如果您的类以不兼容的方式更改,您将需要编写一些自定义序列化代码。

就我个人而言,正是出于这些脆弱性的原因,我试图避免像这样的本机二进制序列化。您可能希望查看诸如Protocol Buffers之类的替代方案。

于 2014-05-16T12:40:12.743 回答
1

问题可能是在添加之前序列化到存储库中的对象 serialVersionUID = 1L- 它们仍然生成了不同于1L. 您应该清除存储库。

于 2014-05-16T12:40:16.160 回答