Heim  >  Artikel  >  Java  >  Wie serialisieren Sie polymorphe Objektlisten mit Gson mithilfe von RuntimeTypeAdapterFactory?

Wie serialisieren Sie polymorphe Objektlisten mit Gson mithilfe von RuntimeTypeAdapterFactory?

Barbara Streisand
Barbara StreisandOriginal
2024-10-30 15:13:02312Durchsuche

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

Gson-Serialisierung polymorpher Objektlisten

Gson bietet eine Lösung zur Serialisierung polymorpher Objekte mithilfe von RuntimeTypeAdapterFactory. Diese Klasse übernimmt automatisch die Serialisierung geerbter Mitglieder, sodass keine benutzerdefinierten Serialisierer geschrieben werden müssen.

Implementierung

Um RuntimeTypeAdapterFactory zu verwenden, befolgen Sie diese Schritte:

  1. Erstellen Sie eine Instanz von RuntimeTypeAdapterFactory für die Basisklasse ObixBaseObj.
  2. Registrieren Sie alle Unterklassen von ObixBaseObj mit registerSubtype().
  3. Stellen Sie die RuntimeTypeAdapterFactory mit registerTypeAdapterFactory() für GsonBuilder bereit.

Beispiel

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

Ausgabe

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

Erweiterter Anwendungsfall

Um eine große Anzahl von Unterklassen zu verarbeiten, erstellen Sie eine Dienstprogrammklasse wie GsonUtils, um die Registrierung zu verwalten und eine zentralisierte Gson-Instanz bereitzustellen.

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

Mit diesem Ansatz werden alle geerbten Mitglieder polymorpher Objekte automatisch übernommen serialisiert und deserialisiert und bietet eine praktische Lösung für die Handhabung komplexer Vererbungshierarchien.

Das obige ist der detaillierte Inhalt vonWie serialisieren Sie polymorphe Objektlisten mit Gson mithilfe von RuntimeTypeAdapterFactory?. 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