GWT – 偶尔会出现com.google.gwt.user.client.rpc.SerializationException
我们偶尔会遇到例外情况,例如:
com.google.gwt.user.client.rpc.SerializationException:types“xxx”不能分配给“com.google.gwt.user.client.rpc.IsSerializable”,并且没有自定义字段序列化程序。出于安全性考虑,此types不会被序列化:实例= xxx,位于com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:610),位于com.google.gwt.user.client.rpc.impl .AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:129)com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter $ ValueWriter $ 8.write(ServerSerializationStreamWriter.java:152)com.google.gwt.user.server。 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.g wt.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(RemoteServiceServlet.java:224)位于javax.servlet.http.HttpServlet.service上的com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)(HttpServlet.java:710)在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain)上的org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)上的javax.servlet.http.HttpServlet.service(HttpServlet.java:803) .java:206)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)at org.apache。org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)。 catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:20 6)在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)at 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的org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)处的org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)。在org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:419)处的org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)处的core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.coyote.ajp.AjpAprProtocol $ AjpConnectionHandler.process(AjpAprProtocol.java:378)at org.apache.tomcat.util.net.AprEndpoint $ Worker .run(AprEndpoint.java:1508)在java.lang.Thread.run(Thread.java:619)
应用程序通常运行良好。 指定的类实现Serializable(整个对象图)。
到目前为止,唯一的模式/观察是:
-
我们似乎只有当应用程序在iframe中使用时才有问题
-
当部署新版本的应用程序时,问题似乎就会发生
-
在隐私模式下运行Firefox(禁用所有caching等)不能解决问题
有任何想法吗?
霍尔格
你检查http://code.google.com/webtoolkit/doc/latest/tutorial/RPC.html#serialize文章说:它有一个默认(零参数)构造函数与任何访问修饰符(例如;private Foo(){}
将工作)
我总是忘记zeroargument常量。 当我做一个可序列化的对象时:D
我在Ubuntu Lucid amd64中使用Tomcat6 + Devmode时遇到了这个问题。 使用com.google.gwt.user.client.rpc.IsSerializable而不是java.io.Serializable似乎解决了这个问题。
我假设你在本地主机和托pipe模式下运行应用程序? 如果是这样的话,您可能需要关注工作目录(或者如果您没有在tomcat服务器上运行应用程序,则需要等效的目录)。 检查webapp文件夹的序列化策略文件(* .gwt.rpc)。
有可能他们没有正确加载,唯一的解决方法,我们发现到目前为止,是每个序列化错误后重新启动您的服务器。
这个问题是由于GWT在运行时会产生序列化策略文件的事实,假设你在托pipe模式下运行。 在编译模式下,GWT将在编译时生成所有必需的文件。 AFAIK,tomcat在运行时无法加载资源文件,因此每次第一次需要时都不会包含序列化文件。
当重新启动服务器时,tomcat能够拾取之前生成的文件,因此在重新启动后不应该收到相同的错误。
你能证实这个吗?
很可能的原因 – 老版本的客户端仍然在浏览器caching。 它发送rpc请求,但服务器已经重新启动,并有更新版本的rpc文件(* .symbolMap)
如果你在JBoss上运行,这可能是因为之前部署的应用程序在卸载时没有被删除。 为了解决这个问题,你必须修改JBoss中的以下文件:$ {JBOSS_HOME} /server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml并设置下列属性为true: deleteWorkDirOnContextDestroy
当以前部署的应用程序没有被清理,GWT可能会混淆它需要加载哪个RPC文件,并最终与那些SerializationException
使用JDK 1.7编译GWT 2.5应用程序时发生此问题。 GWT 2.5支持JDK 1.6,使用这个版本的JDK将解决这个问题。
我有同样的问题,我find了另一个人的解决scheme:
“有可能你有一个实现了Serializable的类,并且你有一个不是Serializable类的属性字段,所以你可能会得到这个exception。
非常感谢那个人:)
我的build议是使你的类中的所有字段(不是原始types)也可以实现Serializable! 这解决了我的问题。
所以RPC文件是独一无二的,因为它们是由servlet加载的,也是在GWT中使用的。 请参阅http://code.google.com/webtoolkit/release-notes.html#Release_Notes_1_4_59 ,其中显示“此文件必须作为公共资源部署到您的Web服务器,可通过ServletContext.getResource()从RemoteServiceServlet访问”
是否有可能新的应用程序正在dynamic重新加载和getResource以某种方式失败? 重新启动应用程序是否解决了问题?
我有相同的错误,并通过清理浏览caching和导航历史logging来解决这个问题。
我也得到一个SerializationException,但我也看到这个错误出现在序列化exception之前:
[uptimereports / 2.340102563369350884]:例如:error:找不到template registration-confirmation.vm
原来是find我的速度模板的问题。 一旦我解决了这个问题,SerializationException停止显示,所以如果你按照Kerem的build议,仍然有问题,请在你的日志中寻找其他exception。
了解确切问题的最好方法是使用-logLevel DEBUG或TRACE编译您的代码,并在“validation单位”中进行检查。 我相信你将能够找出行号的确切问题。
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。 poursérialiserta listen,tu peux faire un truc du genre ces-dessous et faire passer ce nouveau objet 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
拉格朗日