Comment gérer la désérialisation avec le polymorphisme?
J'ai une classe comme:
public class Barn {
String type;
Animal animal;
}
public class Horse extends Animal {
}
public class Cow extends Animal {
}
et je tiens à sérialiser une liste d'entre eux:
List<Barn> barns = new ArrayList<Barn>();
Barn barn1 = new Barn();
barn1.setType("horse");
barn1.setAnimal(new Horse());
barns.add(barn1);
Barn barn2 = new Barn();
barn2.setType("cow");
barn2.setAnimal(new Cow());
barns.add(barn2);
...
Group<Barn> barns = gson.fromJson(serialized);
Quand je sérialiser, saisissez les informations seront perdues pour l'Animal attribut. Est-il une manière que je pourrais installer un analyseur auditeur en quelque sorte pour que je puisse fournir la bonne classe pour désérialiser que lorsque chaque élément de la liste est rencontrés? C'était l'idée derrière manuellement la fourniture d'une chaîne de caractères décrivant le type de classe.
Grâce
Vous devez vous connecter pour publier un commentaire.
Dans le Gson projet de code de base est le RuntimeTypeAdapter, qui apparemment fonctionne bien pour les polymorphes de la sérialisation et la désérialisation. Je ne pense pas que je n'ai pas encore essayé de l'utiliser. Voir http://code.google.com/p/google-gson/issues/detail?id=231 pour plus d'info. Remarque, il n'a pas encore été inclus dans le Gson versions.
Si elle ne correspond pas à vos besoins, puis personnaliser la désérialisation de traitement est nécessaire. La suite est une telle approche, en supposant que vous voulez utiliser la structure JSON démontré. (Je voudrais prendre une approche quelque peu différente, si la structure JSON peut être différent.)
Vous pouvez utiliser Gson Feu pour cela. Le code devrait ressembler à quelque chose comme ceci:
Vous n'avez pas besoin d'écrire votre propre Adaptateur.
Enfin gson a son propre RuntimeTypeAdapterFactory de gérer java polymorphisme, mais malheureusement, il ne fait pas partie de la gson bibliothèque de base (pour l'utiliser, vous devez copier et coller le classe dans votre projet).
Supposons que vous avez cette
Animal.class
:Et
Horse.class
:Vous pouvez initialiser le
RuntimeTypeAdapterFactory
à l'aide du code ci-dessous:Ici vous pouvez trouver plein d'exemple.
Je suis aussi intéressé par la fonctionnalité et j'ai ajouté une demande de fonctionnalité pour GSon
https://github.com/google/gson/issues/869