实体类实现了Serializable仍然报错serialVersionUID不一致解决

自己在开发是创建了一个需要存储到redis的javabean,实现了Serializable但是没有显示的指定serialVersionUID。

如果没有显式地定义一个serialVersionUID,那么Java会默认根据类信息计算一个serivalVersionUID出来。

当时联调为出现问题,后来在javabean中加了一个属性,导致serialVersionUID前后不一致报错。

显式指定serialVersionUID后解决。

补充:

在实现了Serializable接口的class中,需要声明一个long serialVersionUID,用来标明当前class的版本号,但很多人在编程时,总是不原意去声明这个serialVersionUID,又JVM自己来生成。下面来看看serialVersionUID的作用:
1、如果在序列化写 时的版本号和序列化读 时的版本号,不一致,将会有异常:java.io.InvalidClassException:local class incompatible: stream classdesc serialVersionUID = …, local class serialVersionUID = …
2、那如果在class中不声明这个属性呢?那结果可以就会变得比较诡异了:
1)、在序列化写 的时候,虚拟机A会为它计算出一个serialVersionUID,计算的方法是依据class的信息,再具体我也不清楚了。
2)、在序列化读 的时候,虚拟机B也会为class计算出一个serialVersionUID,然后做比较。
3)、那么如果两个虚拟机是不同类型的虚拟机,那么计算方法可能就不一样了,于是即使相同的class,serialVersionUID也可能会不同,不同的class的,理论上来说,也存在serialVersionUID相同的可能性,所以,serialVersionUID尽量由我们自己来指定,而不要由虚拟机来计算。
3、那如果serialVersionUID一致,而class发生了变化呢?
1)、如果虚拟机A中的AClass有一个属性,而虚拟机B中的AClass,没有这个属性,那么这个属性将被忽略,而不会有异常。
2)、如果虚拟机A中的AClass没有的属性,而在虚拟机B中多出来的属性,那么这个属性将被赋予一个缺省值,而不会有异常。
3)、如果虚拟机A中的AClass有一个属性,在虚拟机B中的AClass也有这个属性,但这个属性的类型变了,比如说int变成了long,抑或其他的变化,将会有异常:java.io.InvalidClassException:incompatible types for field …
经过序列化而产生的异常都是 java.io.InvalidClassException,不会产生java.lang.ClassCastException,两者还是有比较大的区别的,从名字上就可以看得出来。
看完你还会让JVM自己来生成serialVersionUID吗?你还加@SuppressWarnings(“serial”)吗?在一个单机上或许看不出什么问题,但在分布式计算、或者你需要提供jar供别人使用的时候,这个问题就会暴露。

在Java中,我们可以为实体类手动添加一个名为serialVersionUID的静态变量,用于标识该类的序列化版本号。我们可以通过以下步骤来添加serialVersionUID: 1. 打开工具栏,选择Editor→Inspections→Java→Serialization issues→Serializable Class without 'serialVersionUID',并勾选该选项。这样在创建实体类后,IDE会自动检查是否缺少serialVersionUID。 2. 通过altet+insert(或其他快捷键),选择SerialVersionUID,IDE将会为我们生成serialVersionUID。 这样做的目的是为了在进行序列化和反序列化操作时,能够保持版本的一致性。当我们在本地类中添加了其他字段,并进行反序列化时,如果没有指定serialVersionUID,Java序列化机制会自动生成一个serialVersionUID,导致反序列化失败。为了解决这个问题,我们需要在本地类中显式地添加一个serialVersionUID变量,并保持其值不变。这样就可以确保序列化和反序列化的一致性。 同时,serialVersionUID的作用还包括将对象的字节序列永久保存到硬盘上,通常存放在一个文件中,以及在网络上传送对象的字节序列。 总结起来,为Java实体类添加serialVersionUID的步骤包括:打开工具栏,选择相应的选项并勾选,通过IDE生成serialVersionUID。这样做的目的是为了确保序列化版本的一致性,并提供对象的长期存储和网络传输的支持。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [idea对实体类生成serialVersionUID以及作用](https://blog.csdn.net/qq_43584064/article/details/115502398)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值