2013-03-07 97 views
0

使用番石榴14.0 GWT RPC 2.5.1-RC1,如Guava libraries and GWT番石榴14.0 GWT串行化可選

番石榴集合的反序列化似乎是工作的精細描述使用Maven構建。然而,當我嘗試反序列化包含Optional.Present的響應DTO時,我遇到了SerializationException。

Caused by: com.google.gwt.user.client.rpc.SerializationException: com.google.common.base.Present/3434853995 
at com.google.gwt.user.client.rpc.impl.SerializerBase.getTypeHandler(SerializerBase.java:153) 

望着SerializerBase.java:146的methodToJava映射不包含:

com.google.common.base.Present/3434853995 

但它確實包含CustomFieldSerializer爲:

com.google.common.base.Present/3491224270 

那麼,什麼是了/ 3434853995映射?

這似乎像這樣的哈希值(在編譯時計算),其SerializerBase使用,以確保服務器端類型相同的客戶端類型。 看着guava-gwt和服務器端的番石榴Optional.Present,這些不匹配。既然Present是在服務器端實例化的,它的哈希值與客戶端的Present不匹配?

回答

1

嗯。我們的內部測試可以成功地GWT序列化服務器創建的Optional,但這不會是我們的公共Guava版本第一次無法匹配我們內部的GWT行爲。

從您給出的鏈接中,聽起來您已經完成了我建議的前兩件事:確保您的客戶端和服務器端庫都依賴於guava-gwt,並在您的GWT中聲明依賴於com.google.common.base.Base模塊。

其他想法,我目前所面對的就是讓您的DTO是什麼樣子。 GWT有時難以確定需要準備序列化的類。說真的,我懷疑的是,這裏的問題:GWT顯然有一定的暗示,它可能需要序列Present,反正,這些問題通常與final領域,這可能會導致你更根本的困難纔會出現。

您也可以確保您不會在不同版本的番石榴的拉動及物莫名其妙。如果它是一個真正的Maven傳遞依賴項,那麼我認爲Maven會出錯,但是如果你的一個依賴項將Guava類直接捆綁到它的jar中,那麼Maven可能不會注意到。這似乎也不太可能,但我正在抓秸稈。

做不到這一切,如果你可以放在一起,我可以在本地運行一個測試用例,我可能會進一步調查。