Comment sérialiser une liste d'objets polymorphes avec Gson
Lors du traitement d'objets polymorphes lors de la sérialisation, l'héritage et la hiérarchie des classes peuvent poser des défis. Une méthode pour résoudre ce problème avec élégance consiste à utiliser RuntimeTypeAdapterFactory de Gson.
Considérons un exemple où nous avons une classe de base, ObixBaseObj, et une classe enfant, ObixOp. Notre objectif est de sérialiser une instance d'ObixBaseObj qui contient une collection d'enfants, y compris ObixOp.
Dans le premier extrait de code, nous rencontrons un problème où les membres hérités (en particulier les chaînes d'entrée et de sortie) sont manquants lors de la sérialisation. . La solution réside dans l'utilisation de RuntimeTypeAdapterFactory :
<code class="java">RuntimeTypeAdapterFactory<ObixBaseObj> adapter = RuntimeTypeAdapterFactory .of(ObixBaseObj.class) .registerSubtype(ObixBaseObj.class) .registerSubtype(ObixOp.class); Gson gson2=new GsonBuilder().setPrettyPrinting().registerTypeAdapterFactory(adapter).create(); System.out.println(gson2.toJson(lobbyObj));</code>
Exemple de travail
Pour un scénario dans lequel plusieurs sous-classes héritent d'ObixBaseObj, nous pouvons implémenter un mécanisme d'enregistrement personnalisé dans ObixBaseObj et utiliser une classe utilitaire, GsonUtils :
<code class="java">public class ObixBaseObj { // ... private static final RuntimeTypeAdapterFactory<ObixBaseObj> adapter = RuntimeTypeAdapterFactory.of(ObixBaseObj.class); public static void registerType( RuntimeTypeAdapterFactory<?> adapter) { GsonUtils.registerType(adapter); } // ... } public class ObixOp extends ObixBaseObj { // ... public ObixOp() { super(); obix = "op"; } // ... }</code>
Dans GsonUtils :
<code class="java">public class GsonUtils { private static final GsonBuilder gsonBuilder = new GsonBuilder() .setPrettyPrinting(); public static void registerType( RuntimeTypeAdapterFactory<?> adapter) { gsonBuilder.registerTypeAdapterFactory(adapter); } public static Gson getGson() { return gsonBuilder.create(); } }</code>
<code class="java">ObixBaseObj lobbyObj = new ObixBaseObj(); lobbyObj.setIs("obix:Lobby"); ObixOp batchOp = new ObixOp(); batchOp.setName("batch"); batchOp.setIn("obix:BatchIn"); batchOp.setOut("obix:BatchOut"); lobbyObj.addChild(batchOp); Gson gson = GsonUtils.getGson(); System.out.println(gson.toJson(lobbyObj));</code>
Cette approche simplifie la sérialisation des objets polymorphes en enregistrant automatiquement les sous-classes et en garantissant que les membres hérités sont inclus dans la sortie sérialisée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!