JAVA对象序列化问题【在线急等!!】

飘过的小牛 2014-01-15 10:28:10
我的使用场景是这样的:

一共有2个程序:A和B。还有一个数据缓冲区:redis。

现在A程序把一个JSON格式的String通过Jackson库转换成一个Object存入redis
B程序从redis读出Object,然后转换成原来的结构(比如A程序和B程序都解析成C类)

但是因为是序列化,所以A序列化进redis的时候,implements Serializable时候生成的SeriaVersionId=1;
但是在B中定义的结构生成的SeriaVersionId=2.

问题:
B程序无法解析这个C类。异常为ClassNotFoundException。是不是因为Id对应不上,B程序的JVM才无法找到C类?于是我把A/B程序的Id都该成一样,但是在B程序中,还是报ClassNotFoundException。而且,B程序的JVM竟然是无法找到A程序中的C类。。。而不是去找在B程序中定义的C类。。。

求指导。谢谢!!!!
...全文
1233 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kakashi8841 2014-01-16
  • 打赏
  • 举报
回复
可以保存Protobuf的对象
飘过的小牛 2014-01-15
  • 打赏
  • 举报
回复
引用 5 楼 rui888 的回复:
json 转的时候过滤掉 SeriaVersionId
这个能具体点吗?
lcf 2014-01-15
  • 打赏
  • 举报
回复
终极解决方案是手写序列化代码,彻底解除依赖限制 当然你可以把序列化代码作为一个公共库,A和B都导入它
tony4geek 2014-01-15
  • 打赏
  • 举报
回复
json 转的时候过滤掉 SeriaVersionId
wangzhidavl 2014-01-15
  • 打赏
  • 举报
回复
因为不同的包里的可以相同的类名,如果要只跟类名而忽略包路径来反序列化,会破坏jvm的规范。 如果要实现楼的效果,可以在反序列化之前把序列化数据里的包路径修改就行了
飘过的小牛 2014-01-15
  • 打赏
  • 举报
回复
现在大概知道原因了: Serializable序列化A程序中的C类时,会代入C类所在的包结构。比如com.abc.hello。 当时在B程序定义的C类包结构为:com.abc.hello2。这样,B程序解析的时候,JVM会从com.abc.hello这个包结构去找C类的定义。这样肯定是找不到了。 所以,暂时只能通过把A类中C定义的位置改为com.abc.hello2.这样才有可能不出错(但是因为数据还在hadoop中,所以暂时无法把数据导入redis) 但是还是觉得这个方法太native了。。。求教各位JAVA达人给我出出主意。
飘过的小牛 2014-01-15
  • 打赏
  • 举报
回复
因为B是线上机器,如果再解析这个JSON就会耗费大量的时间。
zhangchengtest 2014-01-15
  • 打赏
  • 举报
回复
既然是缓存 为什么是序列化进入redis
teemai 2014-01-15
  • 打赏
  • 举报
回复
就是SeriaVersionId 的问题,为什么反序列化换变呢?SeriaVersionId 是唯一标示这个序列化对象的 http://stackoverflow.com/questions/285793/what-is-a-serialversionuid-and-why-should-i-use-it
gloomyfish 2014-01-15
  • 打赏
  • 举报
回复
重载ObjectInputStream对象的 resolveClass与resolveObject方法,返回你想要的class类型即可! 这是最基本的序列化玩法!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧