ホームページ  >  記事  >  Java  >  Gson を使用してポリモーフィック オブジェクトをシリアル化し、すべてのフィールドが JSON 出力に含まれていることを確認するにはどうすればよいですか?

Gson を使用してポリモーフィック オブジェクトをシリアル化し、すべてのフィールドが JSON 出力に含まれていることを確認するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-30 19:27:30952ブラウズ

How can I serialize polymorphic objects with Gson and ensure all fields are included in the JSON output?

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

Gson は、JSON 形式で多態性オブジェクトをシリアル化するための包括的なサポートを提供します。ポリモーフィズムは、オブジェクトの基本クラスは共有されているが実装が異なる場合に発生します。このようなオブジェクトを効果的にシリアル化するために、Gson は RuntimeTypeAdapterFactory として知られる機能を提供しています。

次のシナリオを考えてみましょう。基本クラス ObixBaseObj と、それを継承する複数の子クラス (ObixOp など) があります。子オブジェクトを含む ObixBaseObj 型のオブジェクトをシリアル化する場合、Gson のデフォルトの動作は、基本クラスで定義されたフィールドのみをシリアル化します。これにより、子クラスから特定のフィールドが省略される可能性があります。

これに対処するには、RuntimeTypeAdapterFactory を利用できます。これにより、単一タイプのアダプターの下にさまざまなサブタイプを登録できるようになります。そうすることで、Gson は各サブタイプに固有のフィールドを効果的にシリアル化し、多態性オブジェクトの完全な表現を提供できます。

<code class="java">RuntimeTypeAdapterFactory<ObixBaseObj> adapter = 
                    RuntimeTypeAdapterFactory
                   .of(ObixBaseObj.class)
                   .registerSubtype(ObixBaseObj.class)
                   .registerSubtype(ObixOp.class);</code>

上記のコードは、ObixBaseObj サブタイプと ObixOp サブタイプの両方をアダプターに登録します。次に、これを Gson の設定に統合してポリモーフィック シリアル化を有効にすることができます。

<code class="java">Gson gson2=new GsonBuilder().setPrettyPrinting().registerTypeAdapterFactory(adapter).create();</code>

この変更された Gson インスタンスを使用すると、ポリモーフィック オブジェクトを効果的にシリアル化および逆シリアル化し、基本クラスから継承されたフィールドと特定のクラスから継承されたフィールドを正確に保持できます。

または、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>

ObixBaseObj とその子クラス内で、GsonUtils を利用してサブタイプを確保できます。登録は自動的に実行されます:

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

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

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

このアプローチでは、基本クラスまたは子クラスのインスタンスが作成されるたびに、そのサブタイプが RuntimeTypeAdapterFactory に自動的に登録され、包括的なシリアル化が保証されます。

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

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