RuntimeTypeAdapterFactory を使用して Gson でポリモーフィック オブジェクト リストをシリアル化するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-10-30 15:13:02
オリジナル
378 人が閲覧しました

How do you serialize polymorphic object lists with Gson using RuntimeTypeAdapterFactory?

多態性オブジェクト リストの Gson シリアル化

Gson は、RuntimeTypeAdapterFactory を使用して多態性オブジェクトをシリアル化するソリューションを提供します。このクラスは、継承されたメンバーのシリアル化を自動的に処理するため、カスタム シリアライザーを作成する必要がなくなります。

実装

RuntimeTypeAdapterFactory を使用するには、次の手順に従います。

  1. 基本クラス ObixBaseObj の RuntimeTypeAdapterFactory のインスタンスを作成します。
  2. registerSubtype() を使用して ObixBaseObj のすべてのサブクラスを登録します。
  3. registerTypeAdapterFactory() を使用して RuntimeTypeAdapterFactory を GsonBuilder に提供します。

<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);

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>
ログイン後にコピー

出力

<code class="json">{
  "type": "ObixBaseObj",
  "obix": "obj",
  "is": "obix:Lobby",
  "children": [
    {
      "type": "ObixOp",
      "in": "obix:BatchIn",
      "out": "obix:BatchOut",
      "obix": "op",
      "name": "batch",
      "children": []
    }
  ]
}</code>
ログイン後にコピー

高度な使用例

多数のサブクラスを処理するには、GsonUtils のようなユーティリティ クラスを作成して登録を管理し、一元化された Gson インスタンスを提供します。

<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();
    }
}

public class ObixBaseObj {

    private static final RuntimeTypeAdapterFactory<ObixBaseObj> adapter = 
            RuntimeTypeAdapterFactory.of(ObixBaseObj.class);

    private static final HashSet<Class<?>> registeredClasses= new HashSet<>();

    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";
    }
}

public class ObixOp extends ObixBaseObj {

    private String in;
    private String out;

    public ObixOp() {
        super();
        obix = "op";
    }

    public ObixOp(String in, String out) {
        super();
        obix = "op";
        this.in = in;
        this.out = out;
    }
}</code>
ログイン後にコピー

このアプローチでは、多態性オブジェクトの継承されたすべてのメンバーが自動的にシリアル化および逆シリアル化され、複雑な継承階層を処理するための便利なソリューションを提供します。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート