【问题标题】:Java - Google App Engine - InvalidClassException when I change a class that was stored in session scopeJava - Google App Engine - 当我更改存储在会话范围内的类时出现 InvalidClassException
【发布时间】:2011-02-05 13:34:21
【问题描述】:

我更新了我的 User 类,现在每当有人将旧版本的 User 类存储在他们的会话范围中访问我的网站时,我都会收到一个 InvalidClassException

javax.servlet.ServletException: java.lang.RuntimeException: 
java.io.InvalidClassException: User; local class incompatible: 
stream classdesc serialVersionUID = 4949038118012519093, 
local class serialVersionUID = -971500502189813151

如何阻止这些用户发生此错误?每次我想更新存储在会话范围内的类时,我可能会使每个人的会话无效,但有没有更好的方法,让我的用户不必再次登录?

【问题讨论】:

  • 我没有关闭浏览器,但是通过 GAE 数据存储查看器删除了所有会话,但仍然收到反序列化错误。

标签: java google-app-engine session


【解决方案1】:

你可以添加

private final long serialVersionUID=4949038118012519093;

到你的类定义。新类当然应该具有相同顺序的相同序列化字段。

【讨论】:

  • 在 Java 中,当一个类被序列化和反序列化时,会针对该类的 serialVersionUID 进行检查。默认行为是在编译时为每个可序列化类分配一个新的随机数,如果不是由开发人员创建的。如果您将 1 设置为随机数或 -1,那么只要类不改变就可以了。
  • 如果您添加了生成的 serialVersionUID(例如在 Eclipse IDE 中),但随后您修改了类并部署代码而不重新生成 serialVersionUID,会发生什么情况?
猜你喜欢
  • 2013-03-19
  • 1970-01-01
  • 2018-04-03
  • 2013-10-28
  • 2012-04-13
  • 2012-11-05
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多