は、私は大体次のような構造親オブジェクトのparamsをGSONでデシリアライズして子オブジェクトをインスタンス化し、ジェネリックを使用しますか?
class MyDeserialParent<T extends MyChildInterface> {
MyChildInterface mSerialChild;
... //some other fields (not 'type')
}
を持っている。しかし、次のように子供の二つの性質が親ノードに返される厄介なJSON構造からデシリアライズされます。
{
"myDeserialParents" : [
{
... //some parent properties
"type": "value", //used in a TypeAdapter to choose child implementation
"childProp1": "1",
"childProp2": "2",
},
... //more in this list
]
}
明らかにこれはただSerializedName
でmSerialChildに注釈を付けるとTypeAdapter
はその魔法を働くせるから私を防ぎます。ですから、MyDeserialParent
を逆シリアル化するときは、コンクリートクラスを見つけてMyChildInterface
を探し、childProp1
とchildProp2
をコンストラクタのパラメータとして使用して新しいものを作ります。私はこれについてどうやって行くのか分かりません。
私はその後MyChildInterface
のために自分を正しいコンクリートをインスタンス化し、MyDeserialParent
ためTypeAdapter
(JsonDeserializer
)を使用して想像してdeserialize
にタイプフィールド(だけでなく、2子プロパティ)を取得することができます。
これはつまりMyDeserialParent
クラス(context.deserialize(json, MyDeserialParent.class)
)を作成し、MyChildInterface
インスタンスのセッターを呼び出す必要があることを意味します。私は何かが欠けているようにそれは間違っていると感じる。より良い方法がありますか?
親オブジェクトも手動で作成すると、ジェネリック(:MyDeserialParent
)を指定する方法もありますか?タイプ消去とは、これを行う方法がないことを意味しますか? (私はすでに代わりT
を推測MyDeserialParentの特定のサブタイプを使用する場合、私は型の安全性を得ることができます知っているbecaseこの質問はそれほど重要ではないが、私はそれを避けたいのですが)あなたは、明らかにカスタムTypeAdapter
が必要
これは私自身の解決策に非常に近いもので、私が探していた解決策ではありませんが、ここに来るほとんどの人をカバーする良い答えではありません –