【问题标题】:Guava 14.0 GWT serializing OptionalGuava 14.0 GWT 序列化 可选
【发布时间】:2013-03-09 00:48:44
【问题描述】:

使用带有 GWT RPC 2.5.1-rc1 的 Guava 14.0,使用 maven 构建,如 Guava libraries and 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 是在服务器端实例化的,它的 hash 与客户端 Present 不匹配?

【问题讨论】:

    标签: gwt deserialization guava gwt-rpc


    【解决方案1】:

    嗯。我们的内部测试可以成功地通过 GWT 序列化服务器创建的 Optional,但这并不是我们公开的 Guava 版本第一次无法匹配我们的内部 GWT 行为。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 2010-11-05
      • 2019-08-23
      • 2012-04-29
      相关资源
      最近更新 更多