我们偶尔会遇到例外情况,例如:
com.google.gwt.user.client.rpc.SerializationException:类型"xxx"无法分配给"com.google.gwt.user.client.rpc.IsSerializable",并且没有自定义字段序列化程序.出于安全考虑,此类型不会序列化:com.google.gwt.user.client.rpc.impl中的com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:610)中的instance = xxx .AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:129)维持在com.google.gwt.user.server com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter $ ValueWriter $ 8.write(ServerSerializationStreamWriter.java:152). rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:534)位于com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:609)位于com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:467)com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.的java:564)在com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:188)在de.softconex.travicemanager.server.TraviceManagerServiceImpl.processCall(TraviceManagerServiceImpl.java:615)在com.google .gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:224)在com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)在javax.servlet.http.HttpServlet .service(HttpServlet.java:710)位于org.apache.catalina.core.ApplicationFilterChain的javax.servlet.http.HttpServlet.service(HttpServlet.java:803).internalDoFilter(ApplicationFilterChain.java:290)在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)在org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)在组织位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)的.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve) .java:230)在org.jboss的org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179). org.apache.catalina上的web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84).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)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)at org.apache.coyote.ajp .AjpAprProcessor.process(AjpAprProcessor.java:419)在org.apache.coyote.ajp.AjpAprProtocol $ AjpConnectionHandler.process(AjpAprProtocol.java:378)在org.apache.tomcat.util.net.AprEndpoint $ Worker.run(AprEndpoint .java:1508)在java.lang.Thread.run(Thread.java:619)调用(ErrorReportValve.java:102)在org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)在org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:419)在org.apache.coyote.ajp.AjpAprProtocol $ AjpConnectionHandler .process(AjpAprProtocol.java:378)atg.apache.tomcat.util.net.AprEndpoint $ Worker.run(AprEndpoint.java:1508)at java.lang.Thread.run(Thread.java:619)调用(ErrorReportValve.java:102)在org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)在org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:419)在org.apache.coyote.ajp.AjpAprProtocol $ AjpConnectionHandler .process(AjpAprProtocol.java:378)atg.apache.tomcat.util.net.AprEndpoint $ Worker.run(AprEndpoint.java:1508)at java.lang.Thread.run(Thread.java:619)connector.CoyoteAdapter.service(CoyoteAdapter.java:262)在org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:419)在org.apache.coyote.ajp.AjpAprProtocol $ AjpConnectionHandler.process(AjpAprProtocol.java: 378)atg.apache.tomcat.util.net.AprEndpoint $ Worker.run(AprEndpoint.java:1508)at java.lang.Thread.run(Thread.java:619)connector.CoyoteAdapter.service(CoyoteAdapter.java:262)在org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:419)在org.apache.coyote.ajp.AjpAprProtocol $ AjpConnectionHandler.process(AjpAprProtocol.java: 378)atg.apache.tomcat.util.net.AprEndpoint $ Worker.run(AprEndpoint.java:1508)at java.lang.Thread.run(Thread.java:619)
该应用程序通常正常运行.指示的类实现Serializable(整个对象图).
到目前为止,唯一的模式/观察是:
我们似乎只有在iframe中使用应用程序时才会遇到问题
当部署了新版本的应用程序时,似乎会出现问题
在隐私模式下运行firefox(禁用所有缓存等)并不能解决问题
有任何想法吗?
霍尔格
你检查了http://code.google.com/webtoolkit/doc/latest/tutorial/RPC.html#serialize
文章说:它有一个带有任何访问修饰符的默认(零参数)构造函数(例如private Foo(){}
可以工作)
我总是忘记零参数const.当我制作一个可序列化的对象时:D
我在Ubuntu Lucid amd64中使用Tomcat6 + Devmode时遇到了问题.使用 com.google.gwt.user.client.rpc.IsSerializable而不是java.io.Serializable似乎解决了这个问题.
很可能的原因 - 旧版本的客户端仍然在浏览器中缓存.它发送rpc请求,但服务器已经重新启动并且有更新版本的rpc文件(*.symbolMap)
我假设你在localhost和托管模式下运行应用程序?如果是这样,您可能需要密切关注工作目录(如果未在tomcat服务器中运行应用程序,则需要关注等效目录).检查webapp的文件夹中的序列化策略文件(*.gwt.rpc).
它们可能没有正确加载,我们到目前为止找到的唯一解决方法是在每次序列化故障后重新启动服务器.
问题是由于GWT将在运行时生成其序列化策略文件,假设您正在托管模式下运行.在编译模式下,GWT将在编译时生成所有必需的文件.AFAIK,tomcat无法在运行时加载资源文件,因此每次首次需要时都不会包含序列化文件.
重新启动服务器时,tomcat能够获取以前生成的文件,因此重启后不会收到相同的错误.
你能验证一下吗?
如果您在JBoss上运行,这可能是因为在取消部署时不会删除以前部署的应用程序.要解决此问题,您必须在JBoss中修改以下文件:$ {JBOSS_HOME} /server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml并将以下属性设置为true:deleteWorkDirOnContextDestroy
当先前部署的应用程序未被清除时,GWT可能会混淆它需要加载哪个RPC文件,并最终导致那些SerializationException