我收到以下异常:
com.google.gwt.user.client.rpc.SerializationException:类型“java.lang.Long”未包含在可由此 SerializationPolicy 序列化的类型集中,或者无法加载其 Class 对象。出于安全考虑,此类型不会被序列化
使用 GWT 2.1 和内置的 Jetty 服务器。根据文档,这种类型绝对是可序列化的......我怎样才能将它包含在 SerializationPolicy 中?
我收到以下异常:
com.google.gwt.user.client.rpc.SerializationException:类型“java.lang.Long”未包含在可由此 SerializationPolicy 序列化的类型集中,或者无法加载其 Class 对象。出于安全考虑,此类型不会被序列化
使用 GWT 2.1 和内置的 Jetty 服务器。根据文档,这种类型绝对是可序列化的......我怎样才能将它包含在 SerializationPolicy 中?
这是应该解决问题的链接:http: //developerlife.com/tutorials/ ?p=131
如果满足以下条件,用户定义的类是可序列化的:
- 该类可分配给 IsSerializable 或 java.io.Serializable,因为它实现了这些接口之一,或者因为它派生自实现这些接口之一的超类。
- 所有类的非最终、非瞬态实例字段都是可序列化的
- 该类有一个公共默认(零参数)构造函数
需要在 RPC 服务中包含一个多余的方法,将多个对象“列入白名单”。这是因为使用了泛型,GWT 无法确定我可能正在序列化哪个对象以包含在某个泛型中。
我包括了所有可能需要(取消)序列化为对象成员的类型(SerializableWhitelist
)。我向 RPC servlet 对象添加了一个方法,例如:
public SerializableWhitelist junk(SerializableWhitelist l) { return null; }
值得注意的是,您需要将白名单数据类型作为参数和返回类型都包含在内,因为 GWT 显然维护了两个单独的序列化策略。
尝试删除 war/app 目录中的 *.gwt.rpc 文件,清理并重建。
需要注意的一件事:如果可能,您应该避免使用 long 或 Long,因为它们是
在 GWT 上模拟的(因为没有原生 Javascript long)并且非常
慢。尽可能使用 int 。
仅供参考,我将此作为 GWT 错误提出:http ://code.google.com/p/google-web-toolkit/issues/detail?id=5811
我们会看看他们怎么说。
FWIW,我遇到了这个问题,但我的“对象”类型隐藏在泛型类后面。错误消息本身是错误的。
因此,如果您的 rpc 方法之一涉及一个类:
class Xxx<T> implements IsSerializable {...
它需要更改为:
class Xxx<T extends IsSerializable> 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/”的序列化策略“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。
为我工作。
另一个FWIW:我相信我通过将单个参数构造函数的访问修饰符从默认(无修饰符)更改为“私有”来解决枚举类中的类似问题。无论如何,这样做并没有破坏它,因为它现在就是这样工作的。
我遇到了这个错误并完全卡住了 1 天。然后我遇到了以下快速解决方案:
确保您的 DTO 或实体类遵循可序列化的接口规则。这是您唯一需要做的事情,因为其余的问题将与您的构建创建有关。因此,如果您使用的是 maven,请确保进行干净的构建并清除所有浏览器缓存。我解决了我的问题。我希望它会有所帮助。谢谢!
确保课程在共享文件夹中。这就是我所缺少的。