【问题标题】:GWT - RPC SerializationExceptionGWT - RPC 序列化异常
【发布时间】:2012-03-21 00:37:56
【问题描述】:

我从事 GWT 已经有一段时间了,我需要快速完成一些小事情。我进行了设置,现在我有一个我需要的 RPC,但它失败了。

RPC 应该给我一个 ArrayList,而 Vacancy 位于#projectname#.client.model 中。 调用是在#projectname#.client.model 中进行的。
我的服务的接口在#project#name.client.Service 中。
最后,调用当然会转到#projectname#.server。
Vacancy 实现 IsSerializable。我从运行我的 RPC 得到的异常如下:

Starting Jetty on port 8888
[WARN] Exception while dispatching incoming RPC call
com.google.gwt.user.client.rpc.SerializationException: Type 'firsteight.client.model.Vacancy' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = firsteight.client.model.Vacancy@15fdd2f
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:619)
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126)
    at com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase.serialize(Collection_CustomFieldSerializerBase.java:44)
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serialize(ArrayList_CustomFieldSerializer.java:39)
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serializeInstance(ArrayList_CustomFieldSerializer.java:51)
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serializeInstance(ArrayList_CustomFieldSerializer.java:28)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:740)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:621)
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:153)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:539)
    at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:616)
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:474)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:571)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:324)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)

我制作的 RPC 如下:

void getVacs() {
    try {
        homeService.getVacancies(new AsyncCallback<ArrayList<Vacancy>>() {
            public void onFailure(Throwable caught)
            {
                RootPanel.get("grayblock").add(new HTML("Failed:" + caught.getMessage()));
            }

            public void onSuccess(ArrayList<Vacancy> result)
            {
                RootPanel.get("grayblock").add(new HTML(result.get(0).getTitle()));
            }
        });
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

我以为我已经完成了使 Vacancy 可序列化所需的所有工作,并且将 Vacancy 的 ArrayList 作为 RPC 的返回类型算作将 Vacancy 作为返回类型......对吗?我做错了什么?

提前致谢!

【问题讨论】:

  • 你确定你 implemented com.google.gwt.user.client.rpc.IsSerializable 在你的 Vacancy 班级吗?
  • import com.google.gwt.user.client.rpc.IsSerializable; public class Vacancy implements IsSerializable { 绝对。

标签: java gwt rpc


【解决方案1】:

这通常是由使用不可序列化的类引起的,如果你的类没有实现com.google.gwt.user.client.rpc.IsSerializable 或者你忘记添加一个空的构造函数,就会发生这种情况。

要通过 bean,您必须满足以下要求(来自 GWT 站点):

  1. 它实现 Java Serializable 或 GWT IsSerializable 接口,可以是直接的,也可以是因为它派生自超类 确实如此。
  2. 它的非最终、非瞬态实例字段本身就是 可序列化
  3. 它有一个默认的(零参数)构造函数,可以任意访问 修饰符(例如私有 Foo(){} 将起作用)

即使您满足这些要求,GWT 编译器也会说:

未包含在可以使用的类型集中 此 SerializationPolicy 或其 Class 对象无法序列化 被加载。出于安全目的,此类型不会被序列化。: 实例 = @

问题可能有不同的原因。这是他用于解决问题的完整清单:

  1. 验证类是否有默认构造函数(不带参数)
  2. 验证类是否实现了 Serializable 或 IsSerializable 或 实现一个扩展 Serializable 或扩展类的接口 实现可序列化的
  3. 验证该类是否在客户端中。* 包或...
  4. 验证,如果类不在client.*包中,编译在 您的 GWT xml 模块定义。默认 存在。如果您的课程在另一个包中,则必须添加它 源。例如,如果您的课程在 domain.* 下,您应该 将其添加到 xml 作为 .请注意,类 不能属于服务器包! GWT页面上的更多详细信息: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideModuleXml
  5. 如果您包含来自另一个 GWT 项目的类,您必须 将继承添加到您的 xml 模块定义中。例如,如果您的 Foo 类位于您必须添加的包 com.dummy.domain 中 到模块定义。 更多细节在这里: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideInheritingModules
  6. 如果您包含来自另一个 GWT 项目的类,该项目发布为 一个 jar 验证该 jar 是否还包含源代码,因为 GWT 还为传递给客户端的类重新编译 Java 源代码。

PS:复制自http://isolasoftware.it/2011/03/22/gwt-serialization-policy-error/,因为该站点当前不可用。如果您想阅读原始文章,请使用上述网址从谷歌搜索并从谷歌网络缓存中阅读。

【讨论】:

  • 我已经包含了以下构造函数:public Vacancy() {}。我从服务器检索的对象使用参数化构造函数,但我认为这不会有任何区别..(?)
  • 你能分享你的实现RemoteService接口和传输对象空缺的类
  • 服务器端实现,目前有演示数据:pastebin.com/f88rMZEJ服务:pastebin.com/Yt8piq1m异步:pastebin.com/Lbuav4yr
  • 我已经没有项目代码了,粘贴已经过期了。但是,看看这个例外,我想我可能忘记将 Vacancy 类放在 shared 中。很难想象,但无论如何该项目现在已经消失了,您的答案可能涵盖了正确的答案。谢谢!
  • 我通过向编译器提供 -noincremental 选项使其工作
【解决方案2】:

此异常的另一个原因是浏览器端的 JavaScript 过时。我不得不硬重新加载(CTRL+F5)代码,这个异常就消失了。

【讨论】:

    【解决方案3】:

    我在使用子列表时也遇到了这个错误:

    return myList.subList(fromIndex, toIndex);
    

    【讨论】:

    • 测试return myList是否有效? sublist 不应更改返回的类型。
    • myList 没有改变,但我想获得子列表,所以我用 for loop (java 7) 完成了
    【解决方案4】:

    在我的情况下,我的 target 文件夹中有一些未正确更新的旧缓存。我不得不重新构建项目(Maven -> 更新项目),然后它才能工作。

    【讨论】:

      【解决方案5】:

      首先,确保定义了一个空构造函数
      如果没有,你的类将不能被序列化......

      如果您有一个空的构造函数,请确保您的类(或扩展链中的任何类)实现了 IsSerializable(或任何其他扩展 IsSerializable 的接口)

      如果你的类实现了 IsSerialisable,请检查它是否非最终 ...

      【讨论】:

        【解决方案6】:

        正如 Cipous 所提到的,在我的例子中,我在 Pentaho BI Server 的服务器输出中抛出了这个异常。一个简单的硬重新加载 (CTRL+F5) 就可以了。

        【讨论】:

          猜你喜欢
          • 2012-04-18
          • 2012-04-29
          • 1970-01-01
          • 2014-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-21
          相关资源
          最近更新 更多