[java] Comment ajouter un type à la liste blanche de la politique de sérialisation de GWT?



3 Answers

Il existe une solution de contournement: définissez une nouvelle classe Dummy avec des champs membres de tous les types que vous souhaitez inclure dans la sérialisation. Puis ajoutez une méthode à votre interface RPC:

Dummy dummy(Dummy d);

La mise en œuvre est juste ceci:

Dummy dummy(Dummy d) { return d; }

Et l'interface async aura ceci:

void dummy(Dummy d, AsyncCallback< Dummy> callback);

Le compilateur GWT va ramasser cela, et parce que la classe Dummy référence ces types, il les inclura dans la liste blanche.

Exemple de classe Dummy :

public class Dummy implements IsSerializable {
    private java.sql.Date d;
}
Question

Le sérialiseur de GWT a un support java.io.Serializable limité, mais pour des raisons de sécurité, il existe une liste blanche des types qu'il supporte. La documentation que j'ai trouvée, par exemple cette FAQ, dit que tous les types que vous voulez sérialiser "doivent être inclus dans la liste blanche des politiques de sérialisation", et que la liste est générée à la compilation, mais n'explique pas comment le compilateur décide ce qui se passe sur la liste blanche.

La liste générée contient un certain nombre de types qui font partie de la bibliothèque standard, tels que java.lang.String et java.util.HashMap . java.sql.Date une erreur en essayant de sérialiser java.sql.Date , qui implémente l'interface Serializable , mais n'est pas sur la liste blanche. Comment puis-je ajouter ce type à la liste?




pour assurer le résultat souhaité supprimer toute la war/<app>/gwt/*.gwt.rpc




À mon humble avis le moyen le plus simple d'accéder à la liste blanche par programme est de créer une classe similaire à ceci:

public class SerializableWhitelist implements IsSerializable {
    String[] dummy1;
    SomeOtherThingsIWishToSerialize dummy2;
}

Puis incluez-le dans le paquet .client et la référence du service RPC (afin qu'il soit analysé par le compilateur).

Je n'ai pas trouvé de meilleur moyen pour activer le transfert de cartes non paramétrées, ce qui est évidemment ce dont vous avez parfois besoin pour créer des services plus génériques ...




J'ai trouvé que le simple fait de le mettre dans le paquet client ou de l'utiliser dans une interface de service factice n'était pas suffisant car il semblait que le système l'optimisait.

J'ai trouvé plus facile de créer une classe dérivée de l'un des types déjà utilisés dans l'interface de service et de le coller dans le paquet client. Rien d'autre n'est nécessaire.

public class GWTSerializableTypes extends SomeTypeInServiceInterface implements IsSerializable {
    Long l;
    Double d;
    private GWTSerializableTypes() {}
}



Related