从GWT应用程序中执行RPC时出现SerializationPolicy错误

我收到以下exception:

com.google.gwt.user.client.rpc.SerializationException:类型’java.lang.Long’未包含在可由此SerializationPolicy序列化的类型集中,或者无法加载其Class对象。 出于安全考虑,此类型不会被序列化

使用GWT 2.1和内置的Jetty服务器。 根据文档,这种类型绝对是可序列化的…如何将它包含在SerializationPolicy中?

以下是应该解决问题的链接: http : //developerlife.com/tutorials/?p = 131

在以下情况下,用户定义的类是可序列化

  1. 该类可分配给IsSerializable或java.io.Serializable,因为它实现了这些接口之一,或者因为它是从实现这些接口之一的超类派生的。
  2. 所有类的非final,非瞬态实例字段都是可序列化的
  3. 该类有一个公共默认(零参数)构造函数

需要在RPC服务中包含一个多余的方法,它将许多对象“白名单”。 这是因为generics的使用,GWT无法确定哪些对象可能序列化以包含在一些通用中。

我包含了所有可能需要(un)序列化为对象成员的类型( SerializableWhitelist )。 我在RPC servlet对象中添加了一个方法,如:

public SerializableWhitelist junk(SerializableWhitelist l) { return null; }

值得注意的是,您需要将白名单数据类型包括为参数和返回类型,因为GWT显然维护了两个单独的序列化策略。

尝试删除war / app目录中的* .gwt.rpc文件,清理并重建。

有一点需要注意:如果可能的话,你应该避免长或长,因为它们是
在GWT上模拟(因为没有本地Javascript很长)而且非常
慢。 尽可能使用int。

仅供参考我将其作为GWT错误提出: http : //code.google.com/p/google-web-toolkit/issues/detail? id = 5811

我们会看到他们说的话。

FWIW,我遇到了这个问题,但我的“对象”类型隐藏在一般的类后面 。 错误消息本身是错误的。

因此,如果您的一个rpc方法涉及一个类:

 class Xxx implements IsSerializable {... 

它需要改为:

 class Xxx implements IsSerializable {... 

问题还可能是因为您运行托管模式的本地计算机上的代码与通过RPC连接的外部服务器上的代码不同。 所以在我的情况下,我错过了本地机器上的git pull以匹配外部服务器上部署的内容。 这些变化很小,只是gwt.rpc中包含的一个类中的一个新属性,但这已经足够gwt.rpc md5文件名不同,因此发生了上述错误。

灵感来自http://groups.google.com/group/google-web-toolkit/browse_thread/thread/7dd5123d359ddfa8

使用eclipse和maven以及gwt 2.1.1

编译和部署gwt war。

尝试使用从Eclipse启动的OOPHM。

这对我来说不会。

这将在服务器日志中生成:

错误:找不到序列化策略文件’blah.gwt.rpc’; 你忘了把它包含在这个部署中吗?

警告:无法获取模块’http:// blah:8080 / BlahUI / BlahUI /’的SerializationPolicy’94DEC228B2828D3A5897FEE3D6845A40′; 将使用遗留的,1.3.3兼容的序列化策略。 您可能会遇到SerializationExceptions。

接着

调度传入的RPC调用时出现exceptioncom.google.gwt.user.client.rpc.SerializationException:输入'[LpathToClass;’ 不能分配给’com.google.gwt.user.client.rpc.IsSerializable’并且没有自定义字段序列化程序。出于安全考虑,此类型不会被序列化:instance = [LpathToClass; @ 9d524af at com。 google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:614)

现在已经生成了额外的gwt.rpc文件(通过eclipse / maven插件谁知道?)

重新编译(即使是干净的编译也可以,因为gwt.rpc文件不在目标文件夹中,我的OOPHM gwt.rpc文件与入口点html在同一个文件夹中)并重新部署。 这个新的war文件将包含生成的gwt.rpc文件。

从Eclipse重新启动OOPHM。

适合我。

另一个FWIW:我相信我通过将单个,一个参数构造函数的访问修饰符从默认(无修饰符)更改为“私有”来清除枚举类中的类似问题。 无论如何,这样做并没有打破它,因为它现在正在以这种方式运作。

我遇到了这个错误,完全被困了1天。 然后我遇到了以下快速解决方案:

确保您的DTO或实体类遵循可序列化的接口规则。 它是您唯一需要做的事情,因为其余的问题将与您的构建创建有关。 因此,如果您正在使用maven,请确保清理构建并清除所有浏览器缓存。 我解决了这个问题。 我希望它会有所帮助。 谢谢!

确保该类位于共享文件夹中。 这就是我的失踪。