首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GWT - RPC SerializationException

GWT - RPC SerializationException
EN

Stack Overflow用户
提问于 2012-03-02 21:57:03
回答 6查看 37.1K关注 0票数 16

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

RPC应该给我一个ArrayList,而Vacancy位于#projectname#.client.model。调用是在#projectname#.client.model中进行的。

“我的服务”的接口在#project#name.client.Service中。

最后,调用当然会转到#projectname#.server。

空缺实现IsSerializable。我在运行RPC时得到的异常如下:

代码语言:javascript
复制
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如下所示:

代码语言:javascript
复制
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 Serializable成为可序列化所需的所有工作,并且将Vacancy作为RPC的返回类型计算为将Vacancy作为返回类型。对吗?我做错了什么?

提前感谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-03-02 22:14:09

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

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

  1. 它直接实现了Java或GWT或GWT接口,或者是因为它派生自这样的超类。serializable
  2. It
  3. 它的非最终、非瞬态实例字段本身就是

有一个带有任何访问修饰符的默认(零参数)构造函数(例如,私有Foo(){}将起作用)

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

此SerializationPolicy可以序列化的类型集中不包括

,或者无法加载它的类对象。为安全起见,此类型将不会序列化。例如: instance =@

问题可能有不同的原因。下面是一个完整的清单,可以用来解决这个问题:

package验证类是否具有默认构造函数(没有arguments)

  • Verify ),确保该类实现了Serializable或IsSerializable,或者实现了扩展Serializable的接口,或者实现了实现客户端中的Serializable

  • Verify的类。*
  1. 或…
  2. 验证,如果类不在client.*包中,则在您的GWT模块定义中编译。默认情况下存在。如果您的类位于另一个包中,则必须将其添加到源代码中。例如,如果您的类在domain.*下,则应将其添加到xml中。请注意,类不能属于服务器包!要包含来自另一个http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideModuleXml
  3. If项目的类,必须将继承添加到您的模块定义中。例如,如果您的类Foo在包com.dummy.domain中,则必须添加到模块定义中。这里有更多详细信息:http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideInheritingModules
  4. If您正在包含来自另一个以jar形式发布的GWT项目的类,请验证该jar是否也包含源代码,因为GWT还会重新编译传递给客户端的类的

源代码。

PS:从http://isolasoftware.it/2011/03/22/gwt-serialization-policy-error/复制,因为该站点当前不可用。如果你想阅读原文,使用上面的URL从google搜索它,并从google web缓存中读取它。

票数 36
EN

Stack Overflow用户

发布于 2013-10-04 19:23:28

造成这种情况的另一个原因是浏览器端的javascript已经过时。我不得不硬重新加载(CTRL+F5)代码,这个异常就消失了。

票数 8
EN

Stack Overflow用户

发布于 2018-02-22 16:02:47

当我使用子列表时,我也得到了这个错误:

代码语言:javascript
复制
return myList.subList(fromIndex, toIndex);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9534484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档