java - SerialVersionUID 异常

标签 java serializable serialversionuid

我目前正在编写一个项目,其中有一个可序列化的类 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,这样就不会冲突?

谢谢!

最佳答案

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

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

就我个人而言,正是由于这些脆弱性原因,我尝试避免像这样的 native 二进制序列化。您可能希望查看替代方案,例如 Protocol Buffers .

关于java - SerialVersionUID 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23695116/

相关文章:

如果我在 sql 中使用 'or' 而不是 'in',则 Java 堆空间不足错误

java - 从 BufferedImage 渲染 Sprite 时出现问题

java - OkHttp3无法在Android上开始握手

java - DB 查询很快,但 JPARepository 获取很慢

C# XML 反序列化,其中根节点有时具有 namespace 属性

java - 为什么java中的serialVersionUID必须是static、final、long类型?

java - 使用不同的包名称跨不同应用程序反/序列化 java 对象

Java transient 变量类型必须知道序列化?

java - 为什么 SAXException 是可序列化的?

java - Eclipse中的serialVersionUID生成是否使用serialver?