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

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-31 05:05:02271parcourir

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>

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!

Déclaration:
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