代码拉取完成,页面将自动刷新
开发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
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 这个值就是用来对序列化的版本进行判断的,如果版本相同被认为可以反序列化,这样就确保了安全。
即便是不理会这个异常也没什么事,完全不影响生产环境
我好像明白这个问题是怎么产生的了,谢谢
状态更改为 已关闭
登录 后才可以发表评论