2013-08-06 42 views
0

我在使用GWT 2.4.0序列化Date的方法時遇到了問題,最簡單的解決方案似乎是編寫Date_CustomFieldSerializer - 重載原始實現。使用CustomFieldSerializer的GWT java.util.Date序列化在調試器中失敗

但取決於如何我開始應用程序我得到不同的結果。 很高興部署的版本似乎工作沒有任何麻煩。在另一方面開始從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運行時生成的類之間。

+0

是與此相關的帖子http://stackoverflow.com/questions/18021711/intermitant-serialization-exception-with-gwt-dev-mode-and-external-server?answertab=這個問題主動#tab-top – otonglet

+0

我不這麼認爲,因爲我的問題不是隨機發生的,而是關於序列化本身,而不是什麼對象被序列化。但我會檢查我放在我的靜態目錄中。 – Stroboskop

回答

0

客戶端沒有序列化程序的原因僅僅是GWT無法將其編譯爲JavaScript(因爲偶然添加了一些服務器端日誌記錄引用)。

除非您使用「嚴格」編譯規則,否則這些JavaScript編譯會自動失敗(或將單行添加到編譯器輸出中,並在其他消息中被淹死),並且直到需要時纔會知道缺少的內容。

1

對於有這個問題的人,我有幾天的錯誤信息,昨天我找到了原因!

我在我的類路徑中有2個版本的Date_CustomFieldSerializer類的不同版本。錯誤的是在我的類路徑中添加的,因爲它在gwt-servlet-2.2.0.jar中,它是我在項目中使用的谷歌gin 1.5庫的依賴項。

我將我的項目中的谷歌杜松子酒升級到版本2.1.2,但沒有gwt-servlet依賴項。這樣,Date_CustomFieldSerializer類的任何版本都不應該在類路徑中。如果你有同樣的原因,你不想升級你的谷歌杜松子酒,你可以簡單地排除在谷歌谷歌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>