使用CustomFieldSerializer的GWT java.util.Date序列化在调试器中失败

时间:2013-08-06 13:37:29

标签: gwt serialization

我遇到了由GWT 2.4.0序列化Date的方式的问题,最简单的解决方案似乎是写一个Date_CustomFieldSerializer - 重载原始实现。

但是根据如何我启动应用程序,我会得到不同的结果。 很高兴部署的版本似乎没有任何麻烦。另一方面,从Eclipse启动调试会话会产生以下消息:

com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: The response could not be deserialized
    at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:221)
    at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:287)
    at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:395)
    ...
Caused by: com.google.gwt.user.client.rpc.SerializationException: java.util.Date/1659716317
    at com.google.gwt.user.client.rpc.impl.SerializerBase.getTypeHandler(SerializerBase.java:153)

我调试了服务器和客户端,服务器正在使用我的序列化程序,当客户端通过其“类型签名”查找序列化程序时,客户端失败:java.util.Date/1659716317

奇怪的是,客户端有一个包含java.util.Date/965047388的序列化程序的地图。

GWT如何创建这些类型签名,以及在使用GWT调试器时它们如何不同?

- 编辑 -

我现在知道如何生成数字。 GWT计算层次结构中类名的CRC32哈希值(有时也是方法)。

java.util.Date
com.google.gwt.user.client.rpc.core.java.util.Date_CustomFieldSerializer
java.lang.Object
--> 1659716317 (server side)

java.util.Date
java.lang.Object
--> 965047388 (client side)

当GWT计算客户端的哈希值以查看它为什么不知道序列化程序时,我找不到这个位置,因为它位于CompilingClassLoader和运行时生成的类之间。

2 个答案:

答案 0 :(得分:1)

对于遇到同样问题的人,我现在收到错误消息,昨天我找到了原因!

我的classpath上有两个版本的Date_CustomFieldSerializer类的不同版本。在我的类路径中添加了错误的一个,因为它位于gwt-servlet-2.2.0.jar中,它是我在项目中使用的google gin 1.5库的依赖项。

我将项目中的谷歌杜松子酒升级到版本2.1.2,并且没有gwt-servlet依赖项。这样,Date_CustomFieldSerializer类的任何不同版本都不应该在类路径中。如果你有相同的原因并且你不想升级你的谷歌杜松子酒,你可以简单地从你的pom中的google gin 1.5依赖项中排除依赖关系gwt-servlet-2.2.0。像这样:

<dependencies>
  <dependency>
    <groupId>sample.ProjectA</groupId>
    <artifactId>Project-A</artifactId>
    <version>1.0</version>
    <scope>compile</scope>
    <exclusions>
      <exclusion>  <!-- declare the exclusion here -->
        <groupId>sample.ProjectB</groupId>
        <artifactId>Project-B</artifactId>
      </exclusion>
    </exclusions> 
  </dependency>
</dependencies>

答案 1 :(得分:0)

客户端没有序列化程序的原因只是GWT无法将其编译为JavaScript(因为某些服务器端日志引用是偶然添加的)。

除非你使用“严格”的编译规则,否则这些JavaScript编译会无声地失败(或者将一行添加到编译器输出中,并在其他消息中被淹没),在你需要它之​​前你不会知道你缺少什么。