Maison > Java > javaDidacticiel > le corps du texte

Comment sérialiser une liste d'objets polymorphes avec Gson à l'aide de RuntimeTypeAdapterFactory ?

Mary-Kate Olsen
Libérer: 2024-10-31 05:05:02
original
271 Les gens l'ont consulté

How to Serialize a List of Polymorphic Objects with Gson Using RuntimeTypeAdapterFactory?

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion
<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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!