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