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

Linda Hamilton
リリース: 2024-11-02 21:29:02
オリジナル
819 人が閲覧しました

How to Effectively Serialize Polymorphic Objects with Gson?

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

シリアル化されたオブジェクト表現には、継承されたクラスからのデータが含まれることが多く、多態性オブジェクトを扱う場合は困難になる可能性があります。 JSON シリアル化に Gson を使用して、ポリモーフィック継承をエレガントに処理するソリューションを次に示します。

問題

Gson を使用してポリモーフィック継承を持つオブジェクトを JSON に変換すると、メンバーの値が継承されます。多くの場合、結果の JSON 表現から省略されます。

解決策: RuntimeTypeAdapterFactory

解決策には、Gson の RuntimeTypeAdapterFactory を利用することが含まれます。このユーティリティは、カスタム シリアル化アダプターを必要とせずに、継承されたクラス メンバーを自動的に識別してシリアル化します。

<code class="java">// Register complex class types in the adapter
RuntimeTypeAdapterFactory<ObixBaseObj> adapter = 
    RuntimeTypeAdapterFactory
    .of(ObixBaseObj.class)
    .registerSubtype(ObixBaseObj.class)
    .registerSubtype(ObixOp.class);

// Use registered adapter in GsonBuilder
Gson gson2 = new GsonBuilder().registerTypeAdapterFactory(adapter).create();</code>
ログイン後にコピー

アダプターに型を登録することで、Gson は、JSON 内の特定のメンバー値を含め、シリアル化中に継承されたクラスの型を認識できます。表現.

例: ヘルパー メソッドによるクラス登録

ソリューションを強化するには、GsonUtils などのヘルパー クラスを使用して型の登録を管理することを検討してください。このアプローチは登録を一元化し、個々のクラス コンストラクターでの手動手順の必要性を排除します。

<code class="java">public class GsonUtils {
    // Store registered types
    private static final HashSet<Class<?>> registeredClasses = new HashSet<>();

    // Register a type using RuntimeTypeAdapterFactory
    public static void registerType(RuntimeTypeAdapterFactory<?> adapter) {
        GsonBuilder.registerTypeAdapterFactory(adapter);
    }

    // Get a fully configured Gson instance
    public static Gson getGson() {
        return new GsonBuilder().registerTypeAdapterFactory(adapter).create();
    }
}

// In base class, automatically register inherited classes
public class ObixBaseObj {
    static { GsonUtils.registerType(adapter); }
}</code>
ログイン後にコピー

拡張例: 動的型の登録

このアプローチでは動的型も可能になります。オブジェクトのインスタンス化中の登録。継承されたクラスがインスタンス化されるたびに、クラスは適切なシリアル化のために RuntimeTypeAdapterFactory に自動的に登録されます。

<code class="java">// Dynamic class registration in inherited class
public class ObixOp extends ObixBaseObj {
    public ObixOp() { super(); registerClass(); obix = "op"; }
}</code>
ログイン後にコピー

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

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