0

使用带有 GWT RPC 2.5.1-rc1 的 Guava 14.0,使用 maven 构建,如Guava 库和 GWT中所述

Guava 集合的反序列化似乎运行良好。但是,在尝试反序列化包含 Optional.Present 的响应 DTO 时,我遇到了 SerializationException。

Caused by: com.google.gwt.user.client.rpc.SerializationException: com.google.common.base.Present/3434853995
at    com.google.gwt.user.client.rpc.impl.SerializerBase.getTypeHandler(SerializerBase.java:153)

查看 SerializerBase.java:146 methodToJava 映射不包含:

com.google.common.base.Present/3434853995

但是,它确实包含一个 CustomFieldSerializer 用于:

com.google.common.base.Present/3491224270

那么,/3434853995 映射是怎么回事?

看起来这是 SerializerBase 用来确保服务器端类型与客户端类型相同的哈希(在编译时计算)。查看 guava-gwt 和服务器端 guava Optional.Present,这些不匹配。而且由于 Present 是在服务器端实例化的,它的哈希值与客户端 Present 不匹配?

4

1 回答 1

1

唔。我们的内部测试可以成功地 GWT 序列化 server-created Optional,但这不是我们的公共 Guava 版本第一次无法匹配我们的内部 GWT 行为。

从您提供的链接中,听起来您已经完成了我建议的前两件事:确保您的客户端和服务器端库都依赖于,并在您的 GWT 模块中guava-gwt声明依赖于。com.google.common.base.Base

我目前的另一个想法是询问您的 DTO 是什么样的。GWT 有时难以确定需要准备序列化哪些类。真的,我怀疑这就是问题所在:GWT 显然有一些迹象表明它可能需要 serialize Present,而且无论如何,这些问题通常只出现在final字段中,这可能会给您带来更根本的困难。

您还可以确保您不会以某种方式传递地引入不同版本的 Guava。如果它是真正的 Maven 传递依赖项,那么我认为 Maven 会出错,但如果您的依赖项之一是将 Guava 类直接捆绑到其 jar 中,那么 Maven 可能不会注意到。这似乎也不太可能,但我正在抓住稻草。

如果你做不到这一切,如果你能整理一个我可以在本地运行的测试用例,我可以进一步调查。

于 2013-03-08T16:48:44.017 回答