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

Mary-Kate Olsen
リリース: 2024-10-31 05:05:02
オリジナル
271 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!