目录
一 问题描述
1.1 前提
A、B 两个服务共享一套 Redis 集群,使用 Hessian 对数据进行序列化和反序列化操作。A、B 服务存在同一个 key,value 都是 User 对象。
1.2 现象
A 服务往 Redis 集群写数据,B 服务从 Redis 集群读数据报错;B 服务往 Redis 集群写数据,A 服务从 Redis 集群读数据报错。
二 问题分析
2.1 序列化和反序列化
如图所示,将 java 对象转换成字节数组的过程被称为序列化,将字节数组恢复成 java 对象的过程被称为反序列化。
2.2 现象分析
A 服务往 Redis 里面写数据的过程就是将 User 对象序列化到内存中,且 Hessian 序列化会带上对象的包路径 com.A.domain.User;当 B 服务从 Redis 读数据时,同样需要带上对象的包路径,由于 User 对象在 B 服务中的包路径为 com.B.domain.User,当进行反序列化时,操作失败。
2.3 问题根源
由于 A、B 两个服务对于 User 这个对象的包路径不一致而出现的反序列化失败。
基于 Hessian 协议的序列化和反序列化操作要求序列化和反序列化对象的包路径必须一致。
三 问题解决
3.1 可以将 User 对象的包路径修改成一个。
3.2 修改 Redis 集群序列化和反序列化协议,比如 JSONObject 。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/9594.html