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