Sérialisation d'objets polymorphes avec Gson
La représentation d'objets sérialisés inclut fréquemment des données provenant de classes héritées, ce qui peut être difficile lorsqu'il s'agit d'objets polymorphes. En utilisant Gson pour la sérialisation JSON, voici une solution pour gérer avec élégance l'héritage polymorphe.
Problème
Lors de la transformation d'un objet avec héritage polymorphe en JSON à l'aide de Gson, les valeurs des membres héritées sont souvent omis de la représentation JSON résultante.
Solution : RuntimeTypeAdapterFactory
La solution consiste à utiliser RuntimeTypeAdapterFactory de Gson. Cet utilitaire identifie et sérialise automatiquement les membres de classe hérités sans avoir besoin d'adaptateurs de sérialisation personnalisés.
<code class="java">// Register complex class types in the adapter RuntimeTypeAdapterFactory<ObixBaseObj> adapter = RuntimeTypeAdapterFactory .of(ObixBaseObj.class) .registerSubtype(ObixBaseObj.class) .registerSubtype(ObixOp.class); // Use registered adapter in GsonBuilder Gson gson2 = new GsonBuilder().registerTypeAdapterFactory(adapter).create();</code>
En enregistrant les types avec l'adaptateur, Gson peut reconnaître les types de classe hérités lors de la sérialisation, y compris leurs valeurs de membre spécifiques dans le JSON. représentation.
Exemple : enregistrement de classe avec la méthode d'assistance
Pour améliorer la solution, envisagez d'utiliser une classe d'assistance, telle que GsonUtils, pour gérer les enregistrements de types. Cette approche centralise l'enregistrement et élimine le besoin d'étapes manuelles dans les constructeurs de classes individuelles.
<code class="java">public class GsonUtils { // Store registered types private static final HashSet<Class<?>> registeredClasses = new HashSet<>(); // Register a type using RuntimeTypeAdapterFactory public static void registerType(RuntimeTypeAdapterFactory<?> adapter) { GsonBuilder.registerTypeAdapterFactory(adapter); } // Get a fully configured Gson instance public static Gson getGson() { return new GsonBuilder().registerTypeAdapterFactory(adapter).create(); } } // In base class, automatically register inherited classes public class ObixBaseObj { static { GsonUtils.registerType(adapter); } }</code>
Exemple amélioré : enregistrement de type dynamique
Cette approche permet également l'enregistrement de type dynamique enregistrement lors de l’instanciation de l’objet. Chaque fois qu'une classe héritée est instanciée, la classe est automatiquement enregistrée auprès de RuntimeTypeAdapterFactory pour une sérialisation appropriée.
<code class="java">// Dynamic class registration in inherited class public class ObixOp extends ObixBaseObj { public ObixOp() { super(); registerClass(); obix = "op"; } }</code>
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!