2017-10-18 19 views
1

私は抽象クラスを扱うためにTypeAdapterJsonSerializer/Deserializerの使用について多くを読んでいます。私の問題は入れ子抽象クラスの場合です。入れ子抽象クラスでGSONを扱うにはどうすればいいですか?

abstract class A { 
    String content; 
} 

abstract class G { 
    String otherContent; 
} 

class B extends A { 
    G g; 
} 

class C extends A { 
    String someThing; 
} 

class H extends G { 
    Integer num; 
} 

私はすでに各抽象クラスAGためJsonSerializer/Deserializerクラスをコード化: は、このクラスは言ってみましょう。 gsonbuilder.registerTypeAdapter(A_Adapter).registerTypeAdapter(G_Adapter)にチェーンを使用することができますが、TypeAdapterFactoryのようなものを使用する必要があります(java annotaion/reflectionという抽象クラスに対応するアダプタクラスを指定するために)。 私もTypeAdapterクラスを見ましたが、JsonSerializer/Deserializerに存在するcontext要素がないため実装が複雑すぎます。

どうすればいいですか?あなたはdocumentationからregisterTypeHierarchyAdapter(A.class, new A_Adapter()) を使用することができます(A + B + CAクラスのすべてのサブタイプのための同じシリアライザとdesrializerを使用するには

+0

すべてのフィールドを結合し、Gsonにヌル(または、好ましくはJava 8のオプション)が設定されていない場合、それを1つのクラスにするのはいかがですか?それ以外の場合は、JSONを表示する必要があります。 –

+0

レスポンスありがとうございます。私のクラスシステムはもっと複雑で、継承/抽象化の必要性があります。 –

+0

@RCMSAS 'A'クラス(' A' + 'B' +' C')のすべてのサブタイプに対して同じシリアライザとデシリアライザを使用しますか? 'G' +' H'の別のTypeAdapter? – varren

答えて

0

は 継承型階層のカスタム直列化または直列化復元のためのGsonを設定します。このメソッドは、 TypeAdapter、JsonSerializer、およびJsonDeserializerの登録を結合します。タイプ・アダプター が指定されたタイプ階層に以前に登録されていた場合は、それはオーバーライドされた です。あるタイプのアダプターが タイプ階層内の特定のタイプに登録されている場合は、 タイプの階層に登録されているタイプアダプターの代わりに呼び出されます。

+0

私の質問の半分、今私は 'typeadapterfactory'にそれらを挿入したい。 Actualy私は 'gson.fromJson/toJson'と呼ぶたびに、オブジェクト内の(オブジェクトの深いレベルの)各クラスを検索するたびに、システムを自動化したいと思います。これには、' @classSerializer javaアノテーションは、使用するための適切な「シリアライザ/デシリアライザ」を含む。それがあれば、このクラスを使用してオブジェクトのこの部分を直列化/逆直列化します。 私は私の自己を説明して欲しい:) –

関連する問題