Heim  >  Artikel  >  Java  >  Wie serialisieren Sie polymorphe Objekte mit Gson und bewahren geerbte Mitglieder in der JSON-Ausgabe?

Wie serialisieren Sie polymorphe Objekte mit Gson und bewahren geerbte Mitglieder in der JSON-Ausgabe?

Linda Hamilton
Linda HamiltonOriginal
2024-10-31 21:09:02477Durchsuche

How do you serialize polymorphic objects with Gson and preserve inherited members in the JSON output?

Serialisierung polymorpher Objekte mit Gson

Gson ist eine beliebte Java-Bibliothek zum Konvertieren von Java-Objekten in und von JSON. Eine Herausforderung bei der Serialisierung von Objekten mit Gson ist der Umgang mit Polymorphismus, bei dem mehrere Unterklassen von einer gemeinsamen Oberklasse erben.

Problem

Stellen Sie sich ein Szenario vor, in dem Sie eine Klassenhierarchie mit a haben Basisklasse ObixBaseObj und mehrere geerbte Klassen wie ObixOp. Das Ziel besteht darin, Objekte dieser Klassen mithilfe von Gson in JSON zu serialisieren und dabei die geerbten Mitglieder beizubehalten (z. B. in und out für ObixOp).

GsonSerialisierungsbeispiel

<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 = new Gson();
System.out.println(gson.toJson(lobbyObj));</code>

Ergebnis

<code class="json">{"obix":"obj","is":"obix:Lobby","children":[{"obix":"op","name":"batch"}]}</code>

Beachten Sie, dass der serialisierte JSON die geerbten Mitglieder von ObixOp (in und out) nicht enthält.

RuntimeTypeAdapterFactory Solution

Um Polymorphismus elegant zu handhaben, bietet Gson eine leistungsstarke Funktion namens RuntimeTypeAdapterFactory. Diese Klasse registriert automatisch Unterklassen bei ihrer entsprechenden Oberklasse zur Serialisierung und Deserialisierung.

Implementierung

<code class="java">RuntimeTypeAdapterFactory<ObixBaseObj> adapter = 
                    RuntimeTypeAdapterFactory
                   .of(ObixBaseObj.class)
                   .registerSubtype(ObixBaseObj.class)
                   .registerSubtype(ObixOp.class);


Gson gson2=new GsonBuilder().setPrettyPrinting().registerTypeAdapterFactory(adapter).create();
Gson gson = new Gson();
System.out.println(gson.toJson(lobbyObj));
System.out.println("---------------------");
System.out.println(gson2.toJson(lobbyObj));</code>

Ergebnis

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

Diese Lösung serialisiert korrekt alle Mitglieder, einschließlich der von Unterklassen geerbten.

Umgang mit mehreren Unterklassen

In Fällen, in denen mehrere Unterklassen vorhanden sind, bietet der RuntimeTypeAdapter von Gson einen praktischen Mechanismus um sie zu registrieren.

  1. Erstellen Sie eine zentralisierte Klasse zum Registrieren von Typen (z. B. 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>
  1. Registrieren Sie den Adapter innerhalb der Unterklassen:
<code class="java">public class ObixBaseObj {

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

    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";
    }
}</code>

Dieser Ansatz stellt sicher, dass alle Unterklassen automatisch beim GsonBuilder registriert werden, was den Serialisierungsprozess vereinfacht.

Das obige ist der detaillierte Inhalt vonWie serialisieren Sie polymorphe Objekte mit Gson und bewahren geerbte Mitglieder in der JSON-Ausgabe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn