我们偶尔会遇到例外情况,例如:
com.google.gwt.user.client.rpc.SerializationException:类型“xxx”无法分配给“com.google.gwt.user.client.rpc.IsSerializable”,并且没有自定义字段序列化程序。出于安全考虑,此类型不会被序列化:instance = 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.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:188) at 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) 在javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 在org.apache.catalina.core.ApplicationFilterChain.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.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) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179) 在org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84) 在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at 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) 在org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:419) at 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)
应用程序通常正常运行。指示的类实现Serializable(整个对象图)。
到目前为止,唯一的模式/观察是:
我们似乎只有在iframe中使用该应用程序时才有问题
在部署新版本的应用程序时似乎会出现问题
在隐私模式下运行firefox(禁用所有缓存等)无法解决问题
有什么想法吗?
霍尔格
答案 0 :(得分:32)
private Foo(){}
将起作用)
我总是忘记零参数const。当我制作一个可序列化的对象时:D
答案 1 :(得分:18)
我在Ubuntu Lucid amd64中使用Tomcat6 + Devmode时遇到了问题。使用 com.google.gwt.user.client.rpc.IsSerializable 而不是 java.io.Serializable 似乎解决了这个问题。
答案 2 :(得分:16)
很可能的原因 - 旧版本的客户端仍然在浏览器中缓存。它发送rpc请求,但服务器已经重新启动并且有更新版本的rpc文件(* .symbolMap)
答案 3 :(得分:13)
我假设您在localhost 上运行,在托管模式下运行 ?如果是这样,您可能需要关注 work 目录(如果您没有在tomcat服务器中运行该应用程序,则需要关注等效目录)。检查webapp的文件夹中是否有序列化策略文件(* .gwt.rpc)。
它们可能未正确加载,我们到目前为止找到的唯一解决方法是在每次序列化故障后重新启动服务器。
问题是由于GWT将在运行时生成其序列化策略文件,假设您正在托管模式下运行。在编译模式下,GWT将在编译时生成所有必需的文件。 AFAIK,tomcat无法在运行时加载资源文件,因此每次首次需要时都不会包含序列化文件。
重新启动服务器时,tomcat能够获取以前生成的文件,因此重启后不会收到相同的错误。
你能验证一下吗?
答案 4 :(得分:5)
如果您在JBoss上运行,这可能是由于在取消部署时未删除以前部署的应用程序。要解决此问题,您必须在JBoss中修改以下文件: $ {JBOSS_HOME} /server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml 并将以下属性设置为true: deleteWorkDirOnContextDestroy
当未清除以前部署的应用程序时,GWT可能会混淆它需要加载哪个RPC文件,并最终导致那些SerializationException
答案 5 :(得分:4)
我遇到了同样的问题,我找到了另一个人的解决方案:
"您可能有一个实现Serializable的类,并且该类中的属性字段不是Serializable,因此您可能会遇到此异常。"
非常感谢那个人:)
我的建议是让你的类中的所有字段(不是原始类型)也实现Serializable!这解决了我的问题。
答案 6 :(得分:3)
使用JDK 1.7编译GWT 2.5应用程序时会发生此问题。 GWT 2.5支持JDK 1.6,使用此版本的JDK将解决此问题。
答案 7 :(得分:2)
因此RPC文件是唯一的,因为它们由servlet加载以及在GWT中使用。请参阅http://code.google.com/webtoolkit/release-notes.html#Release_Notes_1_4_59其中的内容“此文件必须作为公共资源部署到您的Web服务器,可通过ServletContext.getResource()从RemoteServiceServlet访问”
是否有可能动态重新加载新应用程序并且getResource以某种方式失败?重新启动应用程序会修复问题吗?
答案 8 :(得分:1)
我遇到了同样的错误,并通过清理浏览缓存和导航历史来解决此问题。
答案 9 :(得分:0)
我也遇到了SerializationException,但我也看到在序列化异常之前出现此错误:
[uptimereports / 2.340102563369350884] .: 示例:错误:找不到模板 登记-confirmation.vm
发现我的速度模板时遇到了问题。一旦我解决了这个问题,SerializationException就会停止显示,所以如果你按照Kerem的建议并且仍然有问题,请在日志中查找其他异常。
答案 10 :(得分:0)
了解确切问题的最佳方法是使用-logLevel DEBUG或TRACE编译代码并检查验证单元内部。我相信你也能找到行号的确切问题。
答案 11 :(得分:0)
首先确保您有一个“干净”的可序列化类,即空构造函数,没有实现可序列化的内部类,并使用 GWT Serializable 类而不是 Java Serializable 类。 然后只需在隐身选项卡(Chrome)中打开您的网站即可解决问题。本地浏览器缓存导致加载旧的 rpc 文件。
答案 12 :(得分:-4)
tu obtiens cette erreur parce que tu essaies de faire passer une liste d'objetsnonsérialiséeparle tunel rpc。 tu devras d'abordérialisertaliste d'objet avant le tranfert vers le tunel rpc。 poursérialisertaliste,tu peux faire un truc du genre ci-dessous et faire passer ce nouveau objet vers le 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
拉格朗日