ホームページ  >  記事  >  Java  >  RuntimeTypeAdapterFactory を使用して Gson でポリモーフィック オブジェクトのリストをシリアル化する方法

RuntimeTypeAdapterFactory を使用して Gson でポリモーフィック オブジェクトのリストをシリアル化する方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-31 05:05:02271ブラウズ

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

Gson を使用して多態性オブジェクトのリストをシリアル化する方法

シリアル化中に多態性オブジェクトを扱う場合、継承とクラス階層によって問題が発生する可能性があります。これにエレガントに対処する 1 つの方法は、Gson の RuntimeTypeAdapterFactory を使用することです。

基本クラス ObixBaseObj と子クラス ObixOp がある例を考えてみましょう。私たちの目標は、ObixOp を含む子のコレクションを含む ObixBaseObj のインスタンスをシリアル化することです。

最初のコード スニペットでは、シリアル化中に継承されたメンバー (特に in および out 文字列) が欠落するという問題が発生します。 。解決策は、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>

作業例

複数のサブクラスが ObixBaseObj から継承するシナリオの場合、ObixBaseObj 内にカスタム登録メカニズムを実装できます。ユーティリティ クラス 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>

を利用するこのアプローチは、サブクラスを自動的に登録し、継承されたメンバーが確実に含まれるようにすることで、多態性オブジェクトのシリアル化を簡素化します。シリアル化された出力内。

以上がRuntimeTypeAdapterFactory を使用して Gson でポリモーフィック オブジェクトのリストをシリアル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。