2013-03-07 95 views
0

使用番石榴14.0 GWT RPC 2.5.1-RC1,如Guava libraries and GWT番石榴14.0 GWT串行化可选

番石榴集合的反序列化似乎是工作的精细描述使用Maven构建。然而,当我尝试反序列化包含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和服务器端的番石榴Optional.Present,这些不匹配。既然Present是在服务器端实例化的,它的哈希值与客户端的Present不匹配?

回答

1

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

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

其他想法,我目前所面对的就是让您的DTO是什么样子。 GWT有时难以确定需要准备序列化的类。说真的,我怀疑的是,这里的问题:GWT显然有一定的暗示,它可能需要序列Present,反正,这些问题通常与final领域,这可能会导致你更根本的困难才会出现。

您也可以确保您不会在不同版本的番石榴的拉动及物莫名其妙。如果它是一个真正的Maven传递依赖项,那么我认为Maven会出错,但是如果你的一个依赖项将Guava类直接捆绑到它的jar中,那么Maven可能不会注意到。这似乎也不太可能,但我正在抓秸秆。

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