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