Maison > Java > javaDidacticiel > Comment sérialiser des listes d'objets polymorphes avec Gson à l'aide de RuntimeTypeAdapterFactory ?

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

Barbara Streisand
Libérer: 2024-10-30 15:13:02
original
415 Les gens l'ont consulté

How do you serialize polymorphic object lists with Gson using RuntimeTypeAdapterFactory?

Gson Sérialisation des listes d'objets polymorphes

Gson fournit une solution pour sérialiser des objets polymorphes à l'aide de RuntimeTypeAdapterFactory. Cette classe gère automatiquement la sérialisation des membres hérités, éliminant ainsi le besoin d'écrire des sérialiseurs personnalisés.

Implémentation

Pour utiliser RuntimeTypeAdapterFactory, suivez ces étapes :

  1. Créez une instance de RuntimeTypeAdapterFactory pour la classe de base ObixBaseObj.
  2. Enregistrez toutes les sous-classes d'ObixBaseObj à l'aide de registerSubtype().
  3. Fournissez la RuntimeTypeAdapterFactory au GsonBuilder à l'aide de registerTypeAdapterFactory().

Exemple

<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);

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

Sortie

<code class="json">{
  "type": "ObixBaseObj",
  "obix": "obj",
  "is": "obix:Lobby",
  "children": [
    {
      "type": "ObixOp",
      "in": "obix:BatchIn",
      "out": "obix:BatchOut",
      "obix": "op",
      "name": "batch",
      "children": []
    }
  ]
}</code>
Copier après la connexion

Cas d'utilisation avancé

Pour gérer un grand nombre de sous-classes, créez une classe utilitaire comme GsonUtils pour gérer l'enregistrement et fournir une instance Gson centralisée.

<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();
    }
}

public class ObixBaseObj {

    private static final RuntimeTypeAdapterFactory<ObixBaseObj> adapter = 
            RuntimeTypeAdapterFactory.of(ObixBaseObj.class);

    private static final HashSet<Class<?>> registeredClasses= new HashSet<>();

    static {
        GsonUtils.registerType(adapter);
    }

    private synchronized void registerClass() {
        if (!registeredClasses.contains(this.getClass())) {
            registeredClasses.add(this.getClass());
            adapter.registerSubtype(this.getClass());
        }
    }


    public ObixBaseObj() {
        registerClass();
        obix = "obj";
    }
}

public class ObixOp extends ObixBaseObj {

    private String in;
    private String out;

    public ObixOp() {
        super();
        obix = "op";
    }

    public ObixOp(String in, String out) {
        super();
        obix = "op";
        this.in = in;
        this.out = out;
    }
}</code>
Copier après la connexion

Avec cette approche, tous les membres hérités des objets polymorphes seront automatiquement sérialisé et désérialisé, offrant une solution pratique pour gérer des hiérarchies d'héritage complexes.

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