我对GWT2.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和运行时生成的类之间。
对于有同样问题的人,我已经收到错误消息好几天了,昨天我找到了原因!
我的类路径上有两个不同版本的类Date_CustomFieldSerializer。在我的类路径中添加了错误的一个,因为它在gwt-servlet-2.2.0.jar中,这是我在项目中使用的谷歌gin 1.5库的依赖项。
我将项目中的google-gin升级到了2.1.2版本,没有对的gwt-servlet依赖。这样一来,类路径中就不应该有Date_CustomFieldSerializer类的不同版本。如果你有同样的原因,并且你不想升级你的谷歌杜松子酒,你可以简单地将依赖gwt-servlet-2.2.0从你的pom中的谷歌杜松酒1.5依赖中排除。像这样:
<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>
客户端没有序列化程序的原因只是GWT无法将其编译为JavaScript(因为一些服务器端日志引用是意外添加的)。
除非您使用"严格"的编译规则,否则这些JavaScript编译将以静默方式失败(或者在编译器输出中添加一行,而这一行会淹没在其他消息中),除非您需要它,否则您将不知道缺少了什么。