【问题标题】:GWT java.util.Date serialization with CustomFieldSerializer fails in debugger使用 CustomFieldSerializer 的 GWT java.util.Date 序列化在调试器中失败
【发布时间】:2013-08-06 13:37:29
【问题描述】:

我对 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 和运行时生成的类之间。

【问题讨论】:

  • 这个问题和这个帖子有关系吗stackoverflow.com/questions/18021711/…
  • 我不这么认为,因为我的问题不是随机发生的,而是序列化本身,而不是序列化的对象。但我会检查我放在静态目录中的内容。

标签: gwt serialization


【解决方案1】:

对于遇到同样问题的任何人,我已经收到了几天的错误消息,昨天我找到了原因!

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

我将项目中的 google gin 升级到了 2.1.2 版,并且没有 gwt-servlet 依赖项。这样,类路径中不应有不同版本的 Date_CustomFieldSerializer 类。如果您有相同的原因并且不想升级您的 google gin,您可以简单地从 pom.xml 中的 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>

【讨论】:

    【解决方案2】:

    客户端没有序列化器的原因仅仅是 GWT 无法将其编译为 JavaScript(因为一些服务器端日志引用是意外添加的)。

    除非您使用“严格”的编译规则,否则这些 JavaScript 编译会默默地失败(或者在编译器输出中添加一行,而这会淹没在其他消息中)并且在您需要之前您不会知道自己缺少什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 2011-11-14
      • 1970-01-01
      相关资源
      最近更新 更多