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

时间:2010-11-17 09:16:27

标签: java serialization gwt rpc gwt-rpc

我遇到以下异常:

  

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

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

10 个答案:

答案 0 :(得分:28)

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

  

如果符合以下条件,则用户定义的类是可序列化的:

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

答案 1 :(得分:20)

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

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

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

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

答案 2 :(得分:8)

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

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

答案 3 :(得分:4)

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

我们会看到他们说的话。

答案 4 :(得分:3)

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

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

class Xxx<T> implements IsSerializable {...

需要更改为:

class Xxx<T extends IsSerializable> implements IsSerializable {...

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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调用时发生异常 com.google.gwt.user.client.rpc.SerializationException:输入'[LpathToClass;'不能分配给'com.google.gwt.user.client.rpc.IsSerializable'并且没有自定义字段序列化程序。出于安全考虑,此类型不会被序列化:instance = [LpathToClass; @ 9d524af     在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。

适合我。

答案 7 :(得分:0)

另一个FWIW:我相信我通过改变在枚举类中解决了类似的问题 默认情况下单个,一个参数构造函数的访问修饰符(无修饰符) '私人'。无论如何,这样做并没有打破它,因为它现在正在以这种方式运作。

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

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