Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
Clear All
new posts

    RPC Serializable problem

    I am working on a gwt-Evaluation project and we are working with smartgwt, our first goal was to simply make a GUI working with local TestData. Now we are supposed to split the client code from the TestData which should be moved to the server. So I need to make RPC calls to get the necessary data from the server services all the time but I have a hard time getting it to work because of non-serializable types I guess. This is a simplyfied code example.

    My user-defined Class is not serializable it seems but I can't figure out why.

    ZeitbuchungDaten.class
    Code:
    package com.isp.ajaxtest.client;
    
    
    import java.util.Date;
    
    import com.google.gwt.user.client.rpc.IsSerializable;
    
    public class ZeitbuchungDaten implements IsSerializable
    {
      private int     idZeitbuchung;
      private int     idMitarbeiter;
      private int     idAuftrag;
      private Date    zeitpunktDerBuchung;
      private int     buchungsArt;
      private double  fertiggestelltInProzent;
      private double  geschaetzteRestzeitInStunden;
      private boolean endeGebucht;
      private int     startIdZeitbuchung;
      private int     endeIdZeitbuchung;
      private boolean storniert;
      private String  kommentarZurBuchung;
    
      public ZeitbuchungDaten( int idZeitbuchung, int idMitarbeiter, int idAuftrag, Date zeitpunktDerBuchung,
                               int buchungsArt )
      {
        this.setIdZeitbuchung( idZeitbuchung );
        this.setIdMitarbeiter( idMitarbeiter );
        this.setIdAuftrag( idAuftrag );
        this.setZeitpunktDerBuchung( zeitpunktDerBuchung );
        this.setBuchungsArt( buchungsArt );
        this.setFertiggestelltInProzent( fertiggestelltInProzent );
        this.setGeschaetzteRestzeitInStunden( geschaetzteRestzeitInStunden );
        this.setEndeGebucht( endeGebucht );
        this.setStartIdZeitbuchung( startIdZeitbuchung );
        this.setEndeIdZeitbuchung( endeIdZeitbuchung );
        this.setStorniert( storniert );
        this.setKommentarZurBuchung( kommentarZurBuchung );
      }
    //Setter+Getter
    }
    FakeDatenService.java
    Code:
    package com.isp.ajaxtest.client;
    
      import java.util.List;
    
    import com.google.gwt.user.client.rpc.RemoteService;
    import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
    
      @RemoteServiceRelativePath("fakeDaten")
      public interface FakeDatenService extends RemoteService {
      
        List<ZeitbuchungDaten> getAlleZeitbuchungen();
        List<ZeitbuchungDaten> getAlleZeitbuchungenByIdAuftrag(int idAuftrag);
      }
    Same for FakeDatenServiceAsync.java

    FakeDatenServiceImpl.java
    Code:
    package com.isp.ajaxtest.server;
    
    
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    import com.google.gwt.user.server.rpc.RemoteServiceServlet;
    
    import com.isp.ajaxtest.client.ZeitbuchungDaten;
    
    public class FakeDatenServiceImpl extends RemoteServiceServlet implements FakeDatenService
    {
      final List<ZeitbuchungDaten> alleZeitbuchungen = new ArrayList<ZeitbuchungDaten>();
    
    @SuppressWarnings("deprecation")
    public FakeDatenServiceImpl()
    {
        //Test Date Object
        final Date date = new Date();
        date.setDate( 22 );
        date.setYear( 108 );
        date.setMonth( 7 );
    
        //ZeitbuchungDatenContainer 
        final ZeitbuchungDaten testZeitbuchung1 = new ZeitbuchungDaten( 1, 1, 1, date, 0 );
        testZeitbuchung1.setEndeGebucht( true );
        testZeitbuchung1.setEndeIdZeitbuchung( 2 );
        alleZeitbuchungen.add( testZeitbuchung1 );
        //many more hard-coded ZeitbuchungDatenObjects....
    
    } 
    
      public List<ZeitbuchungDaten> getAlleZeitbuchungen()
      {
        return alleZeitbuchungen;
      }
      
      public List<ZeitbuchungDaten> getAlleZeitbuchungenByIdAuftrag(int idAuftrag)
      {
        List<ZeitbuchungDaten> alleZeitbuchungenByIdAuftrag = new ArrayList<ZeitbuchungDaten>();
        
        for(int i = 0; i<alleZeitbuchungen.size();i++)
        {
         if(alleZeitbuchungen.get( i ).getIdAuftrag()==idAuftrag)
         {
          alleZeitbuchungenByIdAuftrag.add( alleZeitbuchungen.get(i) ); 
         }
        }
        
        return alleZeitbuchungenByIdAuftrag;
      }
    }
    When I dont implement IsSerializable in ZeitbuchungDaten I get the GUI running until I trigger the RPC call which results in this error:

    "Caused by: com.google.gwt.user.client.rpc.SerializationException: Type 'com.isp.ajaxtest.client.ZeitbuchungDaten' 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."

    When I implement it, I get this error immediately:

    [DEBUG] Analyzing 'com.isp.ajaxtest.client.FakeDatenService' for serializable types
    [DEBUG] Analyzing methods:
    public abstract java.util.List<com.isp.ajaxtest.client.ZeitbuchungDaten> getAlleZeitbuchungen()
    Return type: java.util.List<com.isp.ajaxtest.client.ZeitbuchungDaten>
    java.util.List<com.isp.ajaxtest.client.ZeitbuchungDaten>
    Verifying instantiability
    java.util.Stack<com.isp.ajaxtest.client.ZeitbuchungDaten>
    Checking parameters of 'java.util.Stack<com.isp.ajaxtest.client.ZeitbuchungDaten>'
    Checking type argument 0 of type 'java.util.Stack<E>' because it is directly exposed in this type or in one of its subtypes
    com.isp.ajaxtest.client.ZeitbuchungDaten
    Type 'com.isp.ajaxtest.client.ZeitbuchungDaten' was not serializable and has no concrete serializable subtypes
    java.util.Vector<com.isp.ajaxtest.client.ZeitbuchungDaten>
    Checking parameters of 'java.util.Vector<com.isp.ajaxtest.client.ZeitbuchungDaten>'
    Checking type argument 0 of type 'java.util.Vector<E>' because it is directly exposed in this type or in one of its subtypes
    com.isp.ajaxtest.client.ZeitbuchungDaten
    Type 'com.isp.ajaxtest.client.ZeitbuchungDaten' was not serializable and has no concrete serializable subtypes
    java.util.LinkedList<com.isp.ajaxtest.client.ZeitbuchungDaten>
    Checking parameters of 'java.util.LinkedList<com.isp.ajaxtest.client.ZeitbuchungDaten>'
    Checking type argument 0 of type 'java.util.LinkedList<E>' because it is directly exposed in this type or in one of its subtypes
    com.isp.ajaxtest.client.ZeitbuchungDaten
    Type 'com.isp.ajaxtest.client.ZeitbuchungDaten' was not serializable and has no concrete serializable subtypes
    java.util.Arrays.ArrayList<com.isp.ajaxtest.client.ZeitbuchungDaten>
    Checking parameters of 'java.util.Arrays.ArrayList<com.isp.ajaxtest.client.ZeitbuchungDaten>'
    Checking type argument 0 of type 'java.util.Arrays.ArrayList<E>' because it is exposed as an array with a maximum dimension of 1 in this type or one of its subtypes
    com.isp.ajaxtest.client.ZeitbuchungDaten[]
    Analyzing component type:
    com.isp.ajaxtest.client.ZeitbuchungDaten
    Type 'com.isp.ajaxtest.client.ZeitbuchungDaten' was not serializable and has no concrete serializable subtypes
    java.util.ArrayList<com.isp.ajaxtest.client.ZeitbuchungDaten>
    Checking parameters of 'java.util.ArrayList<com.isp.ajaxtest.client.ZeitbuchungDaten>'
    Checking type argument 0 of type 'java.util.ArrayList<E>' because it is directly exposed in this type or in one of its subtypes
    com.isp.ajaxtest.client.ZeitbuchungDaten
    Type 'com.isp.ajaxtest.client.ZeitbuchungDaten' was not serializable and has no concrete serializable subtypes


    How to fix this problem?
    Last edited by nils2k; 1 Apr 2009, 01:54.

    #2
    GWT needs all it's serializable classes to have a default empty constructor. That's all.
    For your specific case, try adding a "public ZeitbuchungDaten( ){}"

    Comment

    Working...
    X