GWT Dev模式和外部服务器的间歇性序列化异常

时间:2013-08-02 16:18:11

标签: gwt gwt-rpc gwt-platform gwtp

我有一个GWT应用程序,它在Dev模式下使用GWT的嵌入式码头服务器运行得非常完美。

但是,我需要转移到使用外部码头服务器(出于各种原因)。我完全按照GWT文档Compile & Debug进行外部服务器设置。

我的应用程序运行,但是加载时有2/3的时间我得到类似于此的序列化异常(在服务器端):

com.google.gwt.user.client.rpc.SerializationException:类型'my.package.impl.ContentTypeImpl'无法分配给'com.google.gwt.user.client.rpc.IsSerializable'且没有自定义字段序列化程序。出于安全考虑,此类型不会被序列化:instance = my.package.impl.ContentTypeImpl@5e5edf72

我确信这个特定的类是可序列化的,并且我确保编译了我的应用程序并将静态资产移动到我的外部服务器war目录中。就像我说的那样,它每三次刷新浏览器就会起作用。

有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

来自:http://www.gwtproject.org/doc/latest/tutorial/RPC.html#serialize

如果一个类符合这三个要求,那么它是可序列化的:

  1. 它实现 Java Serializable 或GWT IsSerializable 接口,直接或因为它派生自超类 那样做。 < -
  2. 其非最终的非瞬态实例字段本身 serializable,和
  3. 它有一个具有任何访问权限的默认(零参数)构造函数 修饰符(例如私有Foo(){}将起作用

答案 1 :(得分:2)

我的猜测是你在外部服务器中使用一个单独的war目录,已将所有静态内容(包括* .gwt.rpc文件)复制到该war目录,然后对可序列化模型进行了更改您正在通过RPC调用。每当这些模型发生变化时,生成的.gwt.rpc文件都会发生变化。您的服务器将使用序列化策略的一种变体,并且您的客户端java调试将使用不同的。

我可以想到两个选择:

  1. 确保将.gwt.rpc文件复制到服务器war目录。您可以创建自定义ant任务来执行此操作。

  2. 将外部Web服务器配置为指向用于内部GWT调试的相同war目录。这样,当GWT产生变化时,它们会自动出现在正确的位置。

  3. 选项#2是我在处理需要外部服务器的大型复杂系统时使用的选项。