但行好事
莫论前程❤

报错:local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2427389723552147596

报错:

local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2427389723552147596

该错产生来自三个原因:

  • 1.没有指定值:BEAN没有指定序列化值即由JDK给出,客户、服务端使用了不同版本的JDK。

    =》解决:要使用相同JDK

  • 2.没有指定值:某个类在与之对应的对象已经序列化出去后做了修改,而这个属性值由JVM根据类的相关信息计算,而修改后的类的计算结果与修改前的类的计算结果往往不同,从而造成对象的反序列化因为类版本不兼容而失败。

    =》解决:要同时重启应用升级

  • 3.指定值了:客户端BEAN和服务端的BEAN里面序列化值不同。

    =》解决:最好指定,在JDK中,可以利用JDK的bin目录下的serialver.exe工具产生这个serialVersionUID,对于Test.class,执行命令:serialver Test。

    serialVersionUID这个变量是干啥的呢?

serialVersionUID是一个用来版本控制的UID。具体可以参考这篇文章《Understand the serialVersionUID》和相关的JSL

这篇随笔为该文章的阅读笔记。

要测试serialversionUID的版本控制功能,很简单。写三个类:

一个序列化类。

一个写对象流的类。

一个读对象流的类。

当被读取的对象和当前的序列化类的UID不同时会报错。例如:

java.io.InvalidClassException:

local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2427389723552147596

如果不给定一个UID,JVM会自动生成一个。例如上面的错误是产生于下面两段代码:

public class SerialVersionUUIDTest implements Serializable {
  private static final long serialVersionUID = 1L;

}
public class SerialVersionUUIDTest implements Serializable {

}

默认自动生成的UID,有什么坏处呢?不同环境JVM对同一个类生成的UID可能会不同,从而产生错误。所以说采用分布式的技术或者把对象保存到数据库时应该要注意。

赞(0) 打赏
未经允许不得转载:刘鹏博客 » 报错:local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 2427389723552147596
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏