Serialisierung polymorpher Objekte mit Gson
Die serialisierte Objektdarstellung umfasst häufig Daten aus geerbten Klassen, was beim Umgang mit polymorphen Objekten eine Herausforderung sein kann. Mit Gson für die JSON-Serialisierung finden Sie hier eine Lösung für den eleganten Umgang mit polymorpher Vererbung.
Problem
Bei der Umwandlung eines Objekts mit polymorpher Vererbung in JSON mithilfe von Gson werden die Werte der Mitglieder geerbt werden in der resultierenden JSON-Darstellung häufig weggelassen.
Lösung: RuntimeTypeAdapterFactory
Die Lösung beinhaltet die Verwendung von Gsons RuntimeTypeAdapterFactory. Dieses Dienstprogramm identifiziert und serialisiert geerbte Klassenmitglieder automatisch, ohne dass benutzerdefinierte Serialisierungsadapter erforderlich sind.
<code class="java">// Register complex class types in the adapter RuntimeTypeAdapterFactory<ObixBaseObj> adapter = RuntimeTypeAdapterFactory .of(ObixBaseObj.class) .registerSubtype(ObixBaseObj.class) .registerSubtype(ObixOp.class); // Use registered adapter in GsonBuilder Gson gson2 = new GsonBuilder().registerTypeAdapterFactory(adapter).create();</code>
Durch die Registrierung von Typen beim Adapter kann Gson geerbte Klassentypen während der Serialisierung erkennen, einschließlich ihrer spezifischen Mitgliedswerte im JSON Darstellung.
Beispiel: Klassenregistrierung mit Hilfsmethode
Um die Lösung zu verbessern, sollten Sie die Verwendung einer Hilfsklasse wie GsonUtils zum Verwalten von Typregistrierungen in Betracht ziehen. Dieser Ansatz zentralisiert die Registrierung und macht manuelle Schritte in einzelnen Klassenkonstruktoren überflüssig.
<code class="java">public class GsonUtils { // Store registered types private static final HashSet<Class<?>> registeredClasses = new HashSet<>(); // Register a type using RuntimeTypeAdapterFactory public static void registerType(RuntimeTypeAdapterFactory<?> adapter) { GsonBuilder.registerTypeAdapterFactory(adapter); } // Get a fully configured Gson instance public static Gson getGson() { return new GsonBuilder().registerTypeAdapterFactory(adapter).create(); } } // In base class, automatically register inherited classes public class ObixBaseObj { static { GsonUtils.registerType(adapter); } }</code>
Erweitertes Beispiel: Registrierung dynamischer Typen
Dieser Ansatz ermöglicht auch dynamische Typen Registrierung während der Objektinstanziierung. Jedes Mal, wenn eine geerbte Klasse instanziiert wird, wird die Klasse automatisch bei der RuntimeTypeAdapterFactory für die ordnungsgemäße Serialisierung registriert.
<code class="java">// Dynamic class registration in inherited class public class ObixOp extends ObixBaseObj { public ObixOp() { super(); registerClass(); obix = "op"; } }</code>
Das obige ist der detaillierte Inhalt vonWie serialisiert man polymorphe Objekte effektiv mit Gson?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!