21

我收到以下异常:

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

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

4

10 回答 10

28

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

如果满足以下条件,用户定义的类是可序列化的:

  1. 该类可分配给 IsSerializable 或 java.io.Serializable,因为它实现了这些接口之一,或者因为它派生自实现这些接口之一的超类。
  2. 所有类的非最终、非瞬态实例字段都是可序列化的
  3. 该类有一个公共默认(零参数)构造函数
于 2011-09-11T18:16:18.340 回答
20

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

我包括了所有可能需要(取消)序列化为对象成员的类型(SerializableWhitelist)。我向 RPC servlet 对象添加了一个方法,例如:

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

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

于 2010-11-20T22:19:28.190 回答
8

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

需要注意的一件事:如果可能,您应该避免使用 long 或 Long,因为它们是
在 GWT 上模拟的(因为没有原生 Javascript long)并且非常
慢。尽可能使用 int 。

于 2010-11-17T09:34:46.703 回答
4

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

我们会看看他们怎么说。

于 2010-12-23T15:09:06.503 回答
3

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

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

class Xxx<T> implements IsSerializable {...

它需要更改为:

class Xxx<T extends IsSerializable> implements IsSerializable {...
于 2013-05-22T05:15:01.953 回答
1

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

于 2012-01-24T15:44:36.227 回答
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/”的序列化策略“94DEC228B2828D3A5897FEE3D6845A40”;将使用与 1.3.3 兼容的旧版序列化策略。因此,您可能会遇到 SerializationExceptions。

进而

调度传入 RPC 调用 com.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。

为我工作。

于 2011-10-26T03:58:37.450 回答
0

另一个FWIW:我相信我通过将单个参数构造函数的访问修饰符从默认(无修饰符)更改为“私有”来解决枚举类中的类似问题。无论如何,这样做并没有破坏它,因为它现在就是这样工作的。

于 2013-06-11T00:01:34.177 回答
0

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

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

于 2017-03-27T12:25:27.853 回答
0

确保课程在共享文件夹中。这就是我所缺少的。

于 2017-07-06T14:32:21.413 回答