一、异常发生场景
在使用Netty做Android消息推送时,发生了如下异常:
io.netty.handler.codec.DecoderException: java.io.InvalidClassException: failed to read class descriptor
很明显这是一个跟编解码相关的异常
二、异常产生原因
在整个推的项目中,消息是一个Message类,Message必须转换为字节传输,因此在Message类中实现了Serializable接口,在服务器中将Message编码传输到客户端中解码,就是这个环节发生了错误,这是因为服务端的Message类和客户端的Message类的包路径不一样,导致编码和解码不一致,自然会报异常!
三、异常解决
- 序列化的类最好加上serialVersionUID,免java.io.InvalidClassException,不同的JVM对serialVersionUID的计算方法可能不一样,就算类的定义和序列化后的对象是一致的,也可能从JVM-A里序列化后的对象到达JVM-B后,JVM-B认为 Class Invalid
- 服务端和客户端编解码的类的路径要一致