GWT - RPC 序列化异常

2022-09-03 03:50:07

自从我做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可序列化所需的所有工作,并且作为RPC的Revaca返回类型的数组列表算作Vacvacy作为返回类型。右?我做错了什么?

提前致谢!


答案 1

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

要传递一个豆子,你必须满足以下要求(从GWT网站):

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

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

未包含在可由此序列化策略序列化的类型集中,或者无法加载其 Class 对象。出于安全考虑,不会序列化此类型。:实例 =@

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

  1. 验证该类是否具有默认构造函数(不带参数)
  2. 验证该类是否实现了可序列化或可序列化,或者实现了扩展序列化的接口或扩展了实现可序列化的类
  3. 验证该类是否在客户端中。* 包或 ...
  4. 验证该类是否不在 client.* 包中,则在 GWT xml 模块定义中编译。默认情况下为存在。如果您的类位于另一个包中,则必须将其添加到源代码中。例如,如果您的类位于域下。*,则应将其作为 添加到 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. 如果要包含作为 jar 发布的另一个 GWT 项目中的类,请验证该 jar 是否也包含源代码,因为 GWT 还会重新编译传递给客户端的类的 Java 源代码。

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


答案 2

Ahother原因在浏览器方面是过时的javascript。我不得不硬重新加载(CTRL + F5)代码,这个异常消失了。


推荐