java对象从一个系统传输到另一个系统后无法被反序列化的问题

今天测试SpringBoot整合RabbitMq生产者系统向消费者系统发送消息,遇到一个有意思的问题,有必要记录下来。

生产者发送的消息直接使用了一个java对象,该对象实现了Serializable接口。消费者也定义了一个对应的java对象,用于接收生产者发送过来的消息。

生产者所在系统该实体类定义部分代码如下:

生产端实例化对象:

消费者所在系统对应实体类定义部分代码如下:

我们都知道,实现了Serializable接口的java对象是可以进行IO传输的,所以作为消息的一部分进行传递也是没问题的,可是在测试过程中消费端会报反序列化失败的异常,如下:

 经过一番排查,发现代码中存在两个问题会导致出现这个异常。

1、生产端通过全参实例化了一个对象,而消费端对应的实体类没有全参的构造方法

解决办法:

生产端和消费端的构造方法个数和参数必须一样。特别注意:生产端如果没有带全部参数的构造方法,消息可以发送成功,但消费端即使有带全部参数的构造方法也无法反序列化该对象。

2、生产端或者消费端实体类定义的serialVersionUID不一致

 解决办法有两种:

①两个系统中的该实体类定义一样的serialVersionUID。

②两个系统中的该实体类都不定义serialVersionUID(类上会带有警告)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值