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.
<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">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!