3

我有一个 GWT 应用程序,它使用 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 目录中。就像我说的,它大约在我刷新浏览器的第三次工作。

有什么建议么?

谢谢!

4

2 回答 2

3

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

如果一个类满足以下三个要求,则它是可序列化的:

  1. 它实现了Java Serializable或 GWT IsSerializable 接口,或者直接实现,或者因为它派生自实现的超类。<--
  2. 它的非最终的、非瞬态的实例字段本身是可序列化的,并且
  3. 它有一个带有任何访问修饰符的默认(零参数)构造函数(例如私有 Foo(){} 将起作用
于 2013-08-02T19:26:59.597 回答
2

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

我可以想到两个选择:

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

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

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

于 2013-08-03T03:37:34.313 回答