41

我们被偶尔发生的异常所困扰,例如:

com.google.gwt.user.client.rpc.SerializationException:类型“xxx”不可分配给“com.google.gwt.user.client.rpc.IsSerializable”并且没有自定义字段序列化程序。出于安全目的,此类型不会被序列化。:com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:610) 处的实例 = xxx 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。com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:467) 的 encodeResponse(RPC.java:609) 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 org.apache.catalina.core.ApplicationFilterChain 的 javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 的 .service(HttpServlet.java:710)。internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at 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.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) at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve. java:157) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at 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)在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 的 org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157) 调用(ErrorReportValve.java:102)在 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) 在 org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1508) 在 java.lang.Thread.run(Thread.java:619)在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 的 org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157) 调用(ErrorReportValve.java:102)在 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) 在 org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1508) 在 java.lang.Thread.run(Thread.java:619)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) 在 org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1508) 在 java.lang.Thread.run(Thread.java:619)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) 在 org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1508) 在 java.lang.Thread.run(Thread.java:619)

该应用程序通常运行良好。指示的类实现 Serializable(整个对象图)。

到目前为止,唯一的模式/观察结果是:

  • 我们似乎只有在 iframe 中使用应用程序时才会出现问题

  • 部署新版本的应用程序时似乎会出现此问题

  • 在隐私模式下运行 firefox(禁用所有缓存等)并不能解决问题

有任何想法吗?

霍尔格

4

12 回答 12

32

你检查过http://code.google.com/webtoolkit/doc/latest/tutorial/RPC.html#serialize 文章说:它有一个带有任何访问修饰符的默认(零参数)构造函数(例如private Foo(){}会工作)

我总是忘记 zeroargument const。当我制作一个可序列化的对象时:D

于 2010-01-23T18:19:38.777 回答
24

很可能的原因 - 旧版本的客户端仍然缓存在浏览器中。它发送 rpc 请求,但服务器已经重新启动并且具有更新版本的 rpc 文件 (*.symbolMap)

于 2013-03-31T16:52:48.817 回答
18

我在 Ubuntu Lucid amd64 中使用 Tomcat6 + Devmode 时遇到了这个问题。使用 com.google.gwt.user.client.rpc.IsSerializable而不是java.io.Serializable似乎解决了这个问题。

于 2011-10-29T05:13:14.080 回答
14

我假设您在 localhost托管模式下运行应用程序?如果是这样,您可能需要留意工作目录(或者如果您不在 tomcat 服务器中运行应用程序,则为等效目录)。检查 webapp 的文件夹中的序列化策略文件 (*.gwt.rpc)。

它们可能没有正确加载,到目前为止我们发现的唯一解决方法是在每次序列化错误后重新启动服务器。

问题是由于 GWT 将在运行时生成其序列化策略文件,假设您在托管模式下运行。在编译模式下,GWT 将在编译时生成所有必要的文件。AFAIK,tomcat 无法在运行时加载资源文件,因此每次第一次需要时都不会包含序列化文件。

重新启动服务器时,tomcat 能够获取先前生成的文件,因此您在重新启动后不应收到相同的错误。

你能证实这一点吗?

于 2011-09-19T07:42:41.320 回答
5

如果您在 JBoss 上运行,这可能是由于先前部署的应用程序在取消部署时没有被删除。要解决此问题,您必须修改 JBoss 中的以下文件:${JBOSS_HOME}/server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml 并将以下属性设置为 true:deleteWorkDirOnContextDestroy

如果没有清理之前部署的应用程序,GWT 可能会混淆它需要加载哪个 RPC 文件,最终会出现那些 SerializationException

于 2010-09-07T16:00:03.780 回答
4

我遇到了同样的问题,我从另一个人那里找到了解决方案:

“有可能您有一个实现 Serializable 的类,并且您在该类中有一个不可序列化的属性字段,因此您可能会遇到此异常。”

非常感谢那个人:)

我的建议是让你的类中的所有字段(不是原始类型)也实现 Serializable!这解决了我的问题。

于 2013-02-23T16:39:35.037 回答
3

当使用 JDK 1.7 编译 GWT 2.5 应用程序时会出现此问题。GWT 2.5 支持 JDK 1.6,使用这个版本的 JDK 可以解决这个问题。

于 2013-02-19T16:52:06.500 回答
2

因此 RPC 文件是独一无二的,因为它们由 servlet 加载并在 GWT 中使用。请参阅http://code.google.com/webtoolkit/release-notes.html#Release_Notes_1_4_59,其中显示“此文件必须作为公共资源部署到您的 Web 服务器,可通过 ServletContext.getResource() 从 RemoteServiceServlet 访问”

是否有可能动态重新加载新应用程序并且 getResource 以某种方式失败?重新启动应用程序可以解决问题吗?

于 2011-03-06T18:11:44.393 回答
1

我遇到了同样的错误,并通过清理浏览缓存和导航历史记录来解决这个问题。

于 2011-05-17T04:46:43.390 回答
0

我也得到了一个 SerializationException 但我也看到这个错误出现在序列化异常之前:

[uptimereports/2.340102563369350884].:示例:错误:找不到模板registration-confirmation.vm

结果发现我的速度模板是个问题。一旦我解决了这个问题,SerializationException 就停止出现了,所以如果你按照 Kerem 的建议仍然有问题,请在日志中查找其他异常。

于 2010-02-24T22:54:30.500 回答
0

了解确切问题的最佳方法是使用 -logLevel DEBUG 或 TRACE 编译代码并检查内部验证单元。我相信您也可以找出行号的确切问题。

于 2016-05-28T11:06:54.657 回答
0

首先确保您有一个“干净”的可序列化类,即空构造函数,没有实现可序列化的内部类,并使用 GWT 可序列化类而不是 Java 可序列化类。然后只需在隐身标签 (Chrome) 中打开您的网站即可解决问题。本地浏览器缓存会导致加载旧的 rpc 文件。

于 2021-08-03T09:29:05.667 回答