Heim >Java >javaLernprogramm >Wie serialisiere ich eine Liste polymorpher Objekte mit Gson mithilfe von RuntimeTypeAdapterFactory?

Wie serialisiere ich eine Liste polymorpher Objekte mit Gson mithilfe von RuntimeTypeAdapterFactory?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-31 05:05:02339Durchsuche

How to Serialize a List of Polymorphic Objects with Gson Using RuntimeTypeAdapterFactory?

So serialisieren Sie eine Liste polymorpher Objekte mit Gson

Beim Umgang mit polymorphen Objekten während der Serialisierung können Vererbung und Klassenhierarchie Herausforderungen darstellen. Eine Methode, dies elegant anzugehen, ist die RuntimeTypeAdapterFactory von Gson.

Betrachten wir ein Beispiel, in dem wir eine Basisklasse, ObixBaseObj, und eine untergeordnete Klasse, ObixOp, haben. Unser Ziel ist es, eine Instanz von ObixBaseObj zu serialisieren, die eine Sammlung von untergeordneten Elementen enthält, einschließlich ObixOp.

Im ersten Codeausschnitt stoßen wir auf ein Problem, bei dem geerbte Mitglieder (insbesondere In- und Out-Strings) während der Serialisierung fehlen . Die Lösung liegt in der Verwendung von RuntimeTypeAdapterFactory:

<code class="java">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>

Arbeitsbeispiel

Für ein Szenario, in dem mehrere Unterklassen von ObixBaseObj erben, können wir einen benutzerdefinierten Registrierungsmechanismus in ObixBaseObj implementieren und Verwenden Sie eine Dienstprogrammklasse, GsonUtils:

<code class="java">public class ObixBaseObj {
    // ...
    private static final RuntimeTypeAdapterFactory<ObixBaseObj> adapter = 
            RuntimeTypeAdapterFactory.of(ObixBaseObj.class);

    public static void registerType(
            RuntimeTypeAdapterFactory<?> adapter) {
        GsonUtils.registerType(adapter);
    }

    // ...
}

public class ObixOp extends ObixBaseObj {
    // ...
    public ObixOp() {
        super();
        obix = "op";
    }

    // ...
}</code>

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

Dieser Ansatz vereinfacht die Serialisierung polymorpher Objekte, indem Unterklassen automatisch registriert und sichergestellt werden, dass geerbte Mitglieder enthalten sind in der serialisierten Ausgabe.

Das obige ist der detaillierte Inhalt vonWie serialisiere ich eine Liste polymorpher Objekte 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