web-dev-qa-db-fra.com

SerializationException: type non inclus dans le jeu de types sérialisables

Dans mon projet Google Web Toolkit, l'erreur suivante s'est produite:

com.google.gwt.user.client.rpc.SerializationException: le type ‘your.class.Type’ n’est pas inclus dans l’ensemble des types pouvant être sérialisés par ce SerializationPolicy ou son objet Class ne peut pas être chargé. Pour des raisons de sécurité, ce type ne sera pas sérialisé.

Quelles sont les causes possibles de cette erreur?

28
bspoel

GWT assure le suivi d'un ensemble de types pouvant être sérialisés et envoyés au client. your.class.Type n'était apparemment pas sur cette liste. Les listes comme celle-ci sont stockées dans des fichiers .gwt.rpc. Ces listes étant générées, leur édition est probablement inutile. La manière dont ces listes sont générées est un peu floue, mais vous pouvez essayer les choses suivantes:

  • Assurez-vous que your.class.Type implémente Java.io.Serializable
  • Assurez-vous que your.class.Type a un constructeur public no-args
  • Assurez-vous que les membres de your.class.Type font la même chose

  • Vérifiez si votre programme ne contient pas de collections d'un type non sérialisable, par exemple. ArrayList<Object>. Si une telle collection contient your.class.Type et est sérialisée, cette erreur se produira.

  • Assurez your.class.Type implémenter IsSerializable. Cette interface de marqueur était spécialement conçue pour les classes à envoyer au client. Cela n'a pas fonctionné pour moi, mais ma classe a également implémenté Serializable, alors peut-être que les deux interfaces ne fonctionnent pas bien ensemble.

  • Une autre option consiste à créer une classe fictive avec your.class.Type en tant que membre et à ajouter une méthode à votre interface RPC qui obtient et retourne le fictif. Cela oblige le compilateur GWT à ajouter la classe factice et ses membres à la liste blanche de sérialisation.

65
bspoel

J'ajouterai également que si vous souhaitez utiliser une classe imbriquée, utilisez une classe membre statique. C'est à dire.,

public class Pojo {
    public static class Insider {
    }
}

Les classes membres non statiques obtiennent l'exception SerializationException dans GWT 2.4

4
RodK

J'ai eu le même problème dans un RemoteService comme celui-ci

public List<X> getX(...);

où X est une interface. La seule implémentation n’était pas conforme aux règles, c’est-à-dire qu’implémente Serializable ou IsSerializable, possède un constructeur par défaut et que tous ses champs (non transitoires et non finaux) suivent également ces règles.

Mais je continuais à avoir cette exception SerializationException jusqu’à ce que je modifie le type de résultat de List à X [],

public X[] getX(...);

travaillé. Fait intéressant, le seul argument qui soit une liste, Y étant une interface, ne pose aucun problème ...

3
Pat

J'ai rencontré ce problème et si vous utilisez par hasard JPA ou Hibernate, cela peut être dû à la tentative de renvoi de l'objet de requête, au fait de ne pas créer de nouvel objet et de copier vos champs en attente dans ce nouvel objet. Vérifiez les points suivants, que j'ai vus dans un groupe Google.

     @SuppressWarnings("unchecked") 
    public static List<Article> getForUser(User user) 
    { 
            List<Article> articles = null; 
            PersistenceManager pm = PMF.get().getPersistenceManager(); 
            try 
            { 
                    Query query = pm.newQuery(Article.class); 
                    query.setFilter("email == emailParam"); 
                    query.setOrdering("timeStamp desc"); 
                    query.declareParameters("String emailParam"); 
                    List<Article> results = (List<Article>) query.execute(user.getEmail 
     ()); 
                    articles = new ArrayList<Article>(); 
                    for (Article a : results) 
                    { 
                            a.getEmail(); 
                            articles.add(a); 
                    } 
            } 
            finally 
            { 
                    pm.close(); 
            } 
            return articles; 
    } 

cela m'a beaucoup aidé, espérons que cela orientera les autres dans la bonne direction.

2
rjdamore

On dirait que cette question est très similaire à Qu'est-ce que IsSerializable ou non dans GWT? , voir plus de liens vers la documentation connexe ici.

1
alexandroid

Lorsque votre classe a des annotations JDO, cela a été corrigé pour moi (en plus des points de la réponse de bspoel): https://stackoverflow.com/a/4826778/1099376

0
vambo