2010-01-23 83 views
38

我們被例外,如偶爾出現次數困擾:GWT - 偶爾com.google.gwt.user.client.rpc.SerializationException

com.google.gwt.user.client.rpc.SerializationException:類型'xxx'不可分配給'com.google.gwt.user.client.rpc.IsSerializable',並且沒有自定義字段序列化程序。出於安全性考慮,此類型不會被序列化:實例= xxx at com .google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:610) at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:129) at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter $ ValueWriter $ 8.write(ServerSerializationStreamWriter.java:152) at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter .java:534) at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:609) at com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java :467) at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:564) at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:188 ) at de.softconex.travicemanager.server.TraviceManagerServiceImpl.processCall(TraviceManagerServiceImpl.java:615) at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteSe rviceServlet.java:224) at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter( ApplicationFilterChain.java:206) 在org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) 在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 在org.jboss.web.tomcat。 security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve。的java:127) 在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 在org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157) 在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at或g.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262) at org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:419) at org.apache.coyote.ajp.AjpAprProtocol $ AjpConnectionHandler.process(AjpAprProtocol.java:378) at org.apache.tomcat.util.net.AprEndpoint $ Worker.run(AprEndpoint.java:1508) at java.lang.Thread.run(Thread.java:619)

該應用程序通常運行良好。指定的類實現Serializable(整個對象圖)。

迄今爲止唯一模式/意見是:

  • 我們似乎有問題,只有當應用程序使用iframe中

  • 問題似乎發生時的新版本應用程序已部署

  • 在隱私模式下運行firefox(禁用所有緩存等)不能解決問題

任何想法?

霍爾格

回答

32

你檢查http://code.google.com/webtoolkit/doc/latest/tutorial/RPC.html#serialize 文章說: 它有一個默認的無參數的構造函數與任何訪問修飾符(例如private Foo(){}將工作)

我忘了百達常量zeroargument。當我作出了序列化的對象:d

+1

哇,不是那個imho的最佳異常消息!我一直在調試代碼,並且可以看到我的課程沒有將其添加到白名單中,但並不是爲什麼 - 這麼簡單! – HaveAGuess 2011-10-24 20:47:23

+3

Kerem說的肯定是關鍵。我們遇到的另一個問題是,你不應該嘗試序列化內部類。所有正在序列化的類都應該是獨立的類。 – timwoj 2012-09-18 21:31:33

+0

@Kerem Link不再存在'http:// code.google.com/webtoolkit/doc/latest/tutorial/RPC.html#serialize'。 – 2014-03-05 06:52:10

0

我得到一個SerializationException也但我還看到此錯誤表示右串行化異常之前向上:

[uptimereports/2.340102563369350884]: 實施例:錯誤:找不到模板 registration-confirmation.vm

原來是找到我的速度模板的問題。一旦我解決了這個問題,SerializationException停止顯示,所以如果你遵循Kerem的建議並且仍然有問題,請在你的日誌中尋找其他異常。

5

如果您在JBoss上運行,這可能是由於之前部署的應用程序在卸載時未被刪除。爲了解決這個問題,你必須修改JBoss中的以下文件: $ {JBOSS_HOME} /server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml 並將下列屬性設置爲true :deleteWorkDirOnContextDestroy

當先前部署的應用程序不清理,GWT可以混淆它需要哪些RPC文件來加載和你結束了這些SerializationException

2

所以RPC文件是獨一無二的,因爲它們是由servlet加載以及在GWT中使用。請參閱http://code.google.com/webtoolkit/release-notes.html#Release_Notes_1_4_59其中說:「此文件必須作爲公共資源部署到您的Web服務器,可通過ServletContext.getResource()從RemoteServiceServlet訪問」

是否有可能新動態應用程序正在動態重載並且getResource失敗某種方式?重新啓動應用程序是否修復了問題?

1

我已經有相同的錯誤,並通過清理瀏覽緩存和導航歷史記錄來解決這個問題。

+1

在我的項目中,我設法通過刪除文件夾'gwt-unitCache'解決它。 – foch 2012-12-04 14:29:31

+0

技術上這是因爲@ user2229686說的。 – Saintali 2014-03-05 15:30:54

13

我假設你正在主機模式下運行本地主機和上的應用程序?如果是這樣,您可能需要密切關注目錄工作(或者如果您沒有在tomcat服務器中運行應用程序,則需要等效的目錄)。檢查webapp的文件夾是否有序列化策略文件(* .gwt.rpc)。

可能它們沒有正確加載,我們發現的唯一解決方法是在每次序列化錯誤後重新啓動服務器。

這個問題是由於GWT在運行時會產生序列化策略文件,假設你在託管模式下運行。在編譯模式下,GWT將在編譯時生成所有必需的文件。 AFAIK,tomcat無法在運行時加載資源文件,因此每次第一次需要時都不會包含序列化文件。

當重新啓動服務器時,tomcat能夠接收以前生成的文件,因此在重新啓動後不應收到相同的錯誤。

你能證實這一點嗎?

+2

這就是我的情況實際發生的事情......我完全沒有GWT編譯服務器端應用程序,並希望在一個單獨的步驟中做到這一點。編譯GWT部分後,我不得不重新啓動應用程序服務器,之後,一切正常:-)感謝您的提示。 – 2013-06-03 14:16:04

18

我在Ubuntu Lucid amd64中使用Tomcat6 + Devmode時遇到了問題。使用com.google.gwt.user.client.rpc.IsSerializable而不是java.io.Serializable似乎解決了這個問題。

+1

我可以解決這個問題。必須將所有'java.io.Serializable'轉換爲GWT'isSerializable'才能在Linux機器上託管應用程序而不是Windows。有了'isSerializable',任何操作系統都可以做到。看來並不是所有的排列都是正確的。 – Sven 2011-11-22 19:43:24

+0

不僅在Linux上,它發生在Windows使用玻璃魚時 – MyTitle 2012-04-19 12:16:05

+1

我確認此修復解決了我的問題。 當直接連接到我的網站時,它已經在工作,但嵌入到iPhone或Android應用程序中,Web服務出現此錯誤。 通過使用IsSerializable它解決了問題 – 2012-05-05 06:05:10

-4

tu obtiens cette erreur parce que tu essaies de faire passer une liste d'objets nonsérialiséepar le tunel rpc。 tu devras d'abordsérialiserta listen d'objet avant le tranfert vers le tunel rpc。 傾串行器TA清單當然,TU peux放任未TRUC杜流派CI-DESSOUS等放任過路人CE風格客體VERS勒TUNEL RPC

public class ListObjet<T> implements Serializable{ 

    /** Constant used for serialization purpose (serial number). */ 
    private static final long serialVersionUID = 8153484637403868153L; 

    private List<T> listObjet; 

    public List<T> getListOjets() 
    { 
     return listObjet; 
    } 

    public void setListObjet(List<T> m_listObjet) 
    { 
     this.listObjet= m_listObjet; 
    } 
} 

的Merci

拉格朗日

+4

你能說英語服務器上的英語嗎? – 2012-05-16 02:37:43

5

,會出現此問題,當一個GWT 2.5應用程序使用JDK 1.7進行編譯。 GWT 2.5支持JDK 1.6,使用此版本的JDK將解決此問題。

4

我有同樣的問題,我發現從另一個人的解決方案:

「有你有它實現Serializable接口的類的可能性,你有一個類,因此無法序列化您在屬性字段可能會得到這個例外。「

非常感謝這個人:)

我的建議是讓你的班上所有領域(不是原始類型),以實現Serializable也!這解決了我的問題。

+0

剛遇到同樣的問題。一切都很好,除了一個新的嵌入式私有類沒有實現Serializable之外,公共類實現了Serializable。 – 2014-07-18 15:48:01

12

很可能的原因 - 老版本的客戶端仍然在瀏覽器中緩存。它發送rpc請求,但服務器已重新啓動並具有較新版本的rpc文件(* .symbolMap)

+3

是的,在一個乾淨的重建後,我開始看到這個錯誤。在檢查代碼並驗證所有RPC類都是可序列化的之後,我清除了瀏覽器緩存並且一切正常。 – lreeder 2013-11-04 17:18:05

0

知道確切問題的最好方法是使用-logLevel DEBUG或TRACE編譯代碼,並在「驗證單元」 。我相信你可以用行號找出確切的問題。