SerializationException when serialize a HashMap over RPC

29 views
Skip to first unread message

Alejandro D. Garin

unread,
Mar 18, 2009, 5:13:04 PM3/18/09
to Google-We...@googlegroups.com
Hello,

I can't serialize a HashMap and I don't understand why. Could you help me please?
If I remove the following hashMap the RPC work just fine:

private Map<DayHourCoordenate,List<Appointment>> mapData = new HashMap<DayHourCoordenate,List<Appointment>>();

Tomcat error log:

com.google.gwt.user.client.rpc.SerializationException: Type 'com.tasktimer.web.gwt.domain.WeeklyAppointmentData' was not assignable to 'com.google.gwt.user.client.rpc.IsSerializable' and did not have a custom field serializer.  For security purposes, this type will not be serialized.
    at com.google.gwt.user.server.rpc.impl.LegacySerializationPolicy.validateSerialize(LegacySerializationPolicy.java:140)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:591)
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:129)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:146)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:530)
    at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:573)
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:441)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:529)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:164)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:86)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Unknown Source)

The demo clases:

public class SimpleFacadeImpl extends RemoteServiceServlet implements SimpleFacade {

  private static final long serialVersionUID = 1164908101444531503L;

  public SimpleFacadeImpl() {
   
  }
  @Override
  public WeeklyAppointmentData getWeeklyData() {
    WeeklyAppointmentData data = new WeeklyAppointmentData();
    DayHourCoordenate coordenate = new DayHourCoordenate(11,10);
    data.add(coordenate, new Appointment());
    return data;
  }
}

@RemoteServiceRelativePath("/simpleFacade.do")
public interface SimpleFacade extends RemoteService {
 
  public WeeklyAppointmentData getWeeklyData();
}

public class WeeklyAppointmentData implements Serializable {

  private static final long serialVersionUID = 4291039636290439374L;
  private Map<DayHourCoordenate,List<Appointment>> mapData = new HashMap<DayHourCoordenate,List<Appointment>>();
 
  public WeeklyAppointmentData() {
   
  }
  public void add(DayHourCoordenate coordenate, Appointment appointment) {
   
    List<Appointment> list = mapData.get(coordenate);
    if( list == null) {
      list = new ArrayList<Appointment>();
      mapData.put(coordenate, list);
    }
    list.add(appointment);
  }
  public  List<Appointment> get(DayHourCoordenate coordenate) {
    return mapData.get(coordenate);
  }
}

public class DayHourCoordenate implements Serializable {

  private static final long serialVersionUID = 217370389812685596L;
  private int day = 0;
  private int hour = 0;
 
  public DayHourCoordenate() {
   
  }
  public DayHourCoordenate(int day, int hour) {
    this.day = day;
    this.hour = hour;
  }
  public int getDay() {
    return day;
  }
  public void setDay(int day) {
    this.day = day;
  }
  public int getHour() {
    return hour;
  }
  public void setHour(int hour) {
    this.hour = hour;
  } 
  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + day;
    result = prime * result + hour;
    return result;
  }
  @Override
  public boolean equals(Object obj) {
    if (this == obj)
      return true;
    if (obj == null)
      return false;
    if (!(obj instanceof DayHourCoordenate))
      return false;
    DayHourCoordenate other = (DayHourCoordenate) obj;
    if (day != other.day)
      return false;
    if (hour != other.hour)
      return false;
    return true;
  }
}

Vitali Lovich

unread,
Mar 18, 2009, 5:19:08 PM3/18/09
to Google-We...@googlegroups.com
The error message tells you exactly the reason:  WeeklyAppointmentData is not serializable.  Please refer to the serialization rules of GWT (essentially, your classes have to extends IsSerializable, all non-static, non-final, non-transient fields must be serializable & you must provide a default constructor (any visibility, but it must be there).

Since you don't give the definitions for DayHourCoordenate & Appointment, I can't give you the exact reason, but one of those classes is at fault.

Alejandro D. Garin

unread,
Mar 18, 2009, 5:25:03 PM3/18/09
to Google-We...@googlegroups.com
Hi Vitali,

The definitions for DayHourCoordenate is below in my original post and Appointment is serializable because I make a lot of anothers RPC using List<Appointment> without problems.

George Holler

unread,
Mar 18, 2009, 5:15:45 PM3/18/09
to Google-We...@googlegroups.com

The class WeeklyAppointmentData does not appear to implement IsSerializable. That's in the first line of the error stack trace.

G

--- On Wed, 3/18/09, Alejandro D. Garin <aga...@gmail.com> wrote:

> From: Alejandro D. Garin <aga...@gmail.com>
> Subject: SerializationException when serialize a HashMap over RPC
> To: Google-We...@googlegroups.com
> Date: Wednesday, March 18, 2009, 5:13 PM
> Hello,
>
> I can't serialize a HashMap and I don't understand
> why. Could you help me
> please?
> If I remove the following hashMap the RPC work just fine:
>
> private
> Map<DayHourCoordenate,List<Appointment>> mapData
> = new
> HashMap<DayHourCoordenate,List<Appointment>>();
>
> *Tomcat error log:*
> *The demo clases:*

Vitali Lovich

unread,
Mar 18, 2009, 6:05:16 PM3/18/09
to Google-We...@googlegroups.com
That depends on the version of GWT he's using.  As of 1.5 (or 1.4 - can't recall the exact version), Serializable is a synonym for IsSerializable

Vitali Lovich

unread,
Mar 18, 2009, 6:15:38 PM3/18/09
to Google-We...@googlegroups.com
I think I see it.  List is not generally serializable.  The recommendation I recall reading somewhere is to try to use super-classes as infrequently as possible because it makes the compiler's job more difficult - also, in this particular case, the GWT compiler is unable to determine the type to serialize to.

Try:

private Map<DayHourCoordenate,ArrayList<
Appointment>> mapData = new HashMap<DayHourCoordenate,ArrayList<Appointment>>();

or even more preferable, change mapData to a HashMap as well.

Alejandro D. Garin

unread,
Mar 19, 2009, 9:13:12 AM3/19/09
to Google-We...@googlegroups.com
Hi,

I try your suggestion but the same problem. This seems to happend only in hosted mode. I'm using windows GWT 1.5.3 .
Reply all
Reply to author
Forward
0 new messages