2016-05-02 12 views
0

それをより明確にする例:Gsonのシリアル化:ジェネリッククラスとジェネリックデータをその内部にキャストする方法は?

public class GsonDemo { 

    public static void main(String[] args) { 
     Gson gson = new Gson(); 

     DataContainer<ExtendedData> dataContainer = new DataContainer<ExtendedData>(); 
     dataContainer.data = new ExtendedData(); 
     dataContainer.data.baseData = "base_data"; 
     dataContainer.data.extraData = "extra_data"; 

     String json = gson.toJson(dataContainer); // {"data":{"extraData":"extra_data","baseData":"base_data"}} 
     System.out.println(json); 

     json = gson.toJson(dataContainer, new TypeToken<DataContainer<Data>>() {}.getType()); 
     System.out.println(json); // i don't want 'extraData' here. Why it steel serializing? 
    } 

} 

そして、私が使用するデータクラス:

class DataContainer<D extends Data> { 
    D data; 
} 

class Data { 
    String baseData; 
} 

class ExtendedData extends Data { 
    String extraData; 
} 

に私はDataContainer<Data>DataContainer<ExtendedData>をキャストし、extraDataせずに、それをシリアル化します。私は指示TypeToken後に期待すること、

DataContainer<Data> castedDataContainer = (DataContainer<Data>) dataContainer; // Inconvertible types; cannot cast 'DataContainer<ExtendedData>' to 'DataContainer<Data>' 

結果:{"data":{"baseData":"base_data"}}

しかしextraDataは、鋼製のシリアライズである私は実際DataContainer<ExtendedData>をキャストすることはできません。何が間違っていたのですか?

+0

私はここで違いを生むために単純なキャストを期待しません。私はあなたが明示的なコピーをする必要があると思います。 –

答えて

1

Gsonはデータのシリアル化中にリフレクションを使用しているため、キャストは何も変更されません。

必要なのは、どのフィールドをシリアル化するかを制御することです。いくつかの選択肢があります:

最後の1つは、あなたがダイナミックに行動できるようにするため、最も柔軟性があります。

+0

うん、私はまた、カスタムアダプターについて考えると、それは最も正しい方法のように見えます。 – Alexandr

関連する問題