3.2K Star 8.8K Fork 3.6K

GVPJFinal / JFinal

 / 详情

关于java.io.InvalidClassException错误的问题

已完成
创建于  
2015-06-24 22:32

开发JFinal社区的时候碰到的问题,当初百度了一下,按照百度的结果也解决了。
不过最近在osc上搜到一个问答http://www.oschina.net/question/554168_89836
说的就是这个问题,你在下面也回复了,删除eclipse下的session_data即可,但我用的是idea开发的,也不知道该删啥了,只能按照百度的结果在报错的类里将serialVersionUID给加上
想问下,这是jfinal的问题还是java的问题,之前用的是jfinal1.9现在用的是jfinal2.0还是有这个问题
一定要在Model类里添加serialVersionUID吗?为啥其他有些Model类不加也不报错呢?
下面是报的错

Caused by: java.io.InvalidClassException: cn.jfinalbbs.link.Link; local class incompatible: stream classdesc serialVersionUID = 6848091981098837558, local class serialVersionUID = 1326637532221665721
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:621)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1623)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
    at java.util.ArrayList.readObject(ArrayList.java:791)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
    at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:501)
    at net.sf.ehcache.Element.readObject(Element.java:876)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1896)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
    at net.sf.ehcache.store.disk.DiskStorageFactory.read(DiskStorageFactory.java:367)
    at net.sf.ehcache.store.disk.DiskStorageFactory.retrieve(DiskStorageFactory.java:883)
    ... 40 more

评论 (5)

jfinal 提供这个持久化 session 的功能,只是用于开发阶段,生产环境完全不受影响,持久化 session数据是为了让开发那种需要登录的项目不需反复去登录。如果不提供这个功能,当你的系统重启后你得再登录,影响开发效率

也就是说,这个问题,不是jfinal框架的问题,对吧

出现这个异常的过程是这样的:
1:假定你有一个 model叫 User
2:登录时向 session 中放入了 User 对象,
3:对 User 对象的源码进行修改并保存,则会触发 jetty 重启
4:jetty 重启前会将 session 中的 user 序列化,然后保存到硬盘,序列化需要一个serialVersionUID值,发现你的 User 类中没有这个值,所以会用默认算法算出来一个值,这个值与 User 类中的方法以及属性名都有关系
5:jetty 重启会再将硬盘中刚刚持久化的值再反向序列化,并且会用到 serialVersionUID 值,由于你的User 在 3 中修改了源码,所以造成此时的 serialVersionUID 与开始持久化的值不同,所以抛异常
  本质上来说 serialVersionUID 这个值就是用来对序列化的版本进行判断的,如果版本相同被认为可以反序列化,这样就确保了安全。
  即便是不理会这个异常也没什么事,完全不影响生产环境

我好像明白这个问题是怎么产生的了,谢谢

状态更改为 已关闭

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
Violation 840 jfinal 1580661334
Java
1
https://gitee.com/jfinal/jfinal.git
git@gitee.com:jfinal/jfinal.git
jfinal
jfinal
JFinal

搜索帮助

53164aa7 5694891 3bd8fe86 5694891