GWT - RPC SerializationException

37,441

Solution 1

This is normally caused by using a non-serializable class, which can occur if your class does not implement com.google.gwt.user.client.rpc.IsSerializable or if you have forgotten to add an empty constructor.

To pass a bean you have to fulfill the following requirements (from GWT site):

  1. It implements either Java Serializable or GWT IsSerializable interface, either directly, or because it derives from a superclass that does.
  2. Its non-final, non-transient instance fields are themselves serializable
  3. It has a default (zero argument) constructor with any access modifier (e.g. private Foo(){} will work)

Even if you fulfill these requirements may happen that GWT compiler say:

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 = @

The problem may have different causes. Here his a complete check list to use for solving the problem:

  1. Verify that the class has a default constructor (without arguments)
  2. Verify that the class implements Serializable or IsSerializable or implements an Interface that extends Serializable or extends a class that implement Serializable
  3. Verify that the class is in a client.* package or …
  4. Verify, if the class is not in client.* package, that is compiled in your GWT xml module definition. By default is present. If your class is in another package you have to add it to source. For example if your class is under domain.* you should add it to xml as . Be aware that the class cannot belong to server package! More details on GWT page: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideModuleXml
  5. If you are including the class from another GWT project you have to add the inherits to your xml module definition. For example if your class Foo is in the package com.dummy.domain you have to add to the module definition. More details here: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideInheritingModules
  6. If you are including the class from another GWT project released as a jar verify that the jar contains also the source code because GWT recompile also the Java source for the classes passed to the Client.

PS:copied from http://isolasoftware.it/2011/03/22/gwt-serialization-policy-error/ because the site is unavailable currently. If you want to read the original article search it from google using the above URL and read it from google web cache.

Solution 2

Ahother reason for this exeption was outdated javascript on browser side. I had to hard reload (CTRL+F5) the code and this exception was gone.

Share:
37,441
Mark Tielemans
Author by

Mark Tielemans

Ardent young professional, always working hard to broaden my expertise and comprehension of the latest and-/or greatest technologies in the field of (enterprise) software development.

Updated on March 11, 2020

Comments

  • Mark Tielemans
    Mark Tielemans about 4 years

    It's been a while since I've been doing GWT and I needed something small done quickly. I set things up and now I have a RPC I need, but it fails.

    The RPC is supposed to give me a ArrayList, and Vacancy is located in #projectname#.client.model. The call is made in #projectname#.client.model.
    The interfaces for my Services are in #project#name.client.Service.
    Finally, the calls of course go to #projectname#.server.
    Vacancy implements IsSerializable. The Exception I get from running my RPC is the following:

    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)
    

    The RPC I make is the following:

    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();
        }
    }
    

    I thought I had done all I needed to make Vacancy Serializable, and an ArrayList of Vacancy as returntype for the RPC counts as having Vacancy as return type.. right? What am I doing wrong?

    Thanks in advance!

  • Mark Tielemans
    Mark Tielemans about 12 years
    I have included the following constructor: public Vacancy() {}. The object that I retrieve from the server uses a parameterized constructor, but I don't think that should make any difference..(?)
  • Jama A.
    Jama A. about 12 years
    can you share your class which implements RemoteService interface and transfer object Vacancy
  • Mark Tielemans
    Mark Tielemans about 12 years
    Server side implementation, currently with demo data: pastebin.com/f88rMZEJ Service: pastebin.com/Yt8piq1m Async: pastebin.com/Lbuav4yr
  • Mark Tielemans
    Mark Tielemans over 11 years
    I haven't got the project code anymore and the pastes have expired. However, looking at the exception I think I may've forgotten to put the Vacancy class in shared. Can hardly imagine it, but the project's gone now anyway and your answer likely covers the right one. Thanks!
  • geoji
    geoji about 7 years
    I got it working by providing the -noincremental option to the compiler
  • Mark Tielemans
    Mark Tielemans about 6 years
    Does it work if you test return myList? sublist should not change the returned type.
  • paka
    paka about 6 years
    myList wasn't change, but I wanted to get sublist, so I did it with for loop (java 7)