mam mniej więcej następującą strukturęUtworzenie obiektu podrzędnego za pomocą params z obiektu macierzystego, który jest deserializowany za pomocą GSON i używa generycznych?
class MyDeserialParent<T extends MyChildInterface> {
MyChildInterface mSerialChild;
... //some other fields (not 'type')
}
Ale to rozszeregować z messy struktury JSON dwie właściwości dziecka są zwrócone na węźle nadrzędnym jak następuje.
{
"myDeserialParents" : [
{
... //some parent properties
"type": "value", //used in a TypeAdapter to choose child implementation
"childProp1": "1",
"childProp2": "2",
},
... //more in this list
]
}
Oczywiście to nie pozwala mi tylko adnotacji mSerialChild z SerializedName
i pozwalając TypeAdapter
pracy jej magii. Więc mam nadzieję, że to się stanie, gdy MyDeserialParent
jest deserializowany, użyj "typ", aby znaleźć właściwą klasę betonu MyChildInterface
i utworzyć nową z wykorzystaniem childProp1
i childProp2
jako parametrów konstruktora. Nie wiem, jak to osiągnąć.
mogę sobie wyobrazić, używając TypeAdapter
(JsonDeserializer
) dla MyDeserialParent
aw deserialize
uzyskać pole typu (a także dwie właściwości podrzędne), następnie instancję właściwą betonu dla MyChildInterface
siebie.
To oznacza, że muszę utworzyć swoją klasę MyDeserialParent
(z context.deserialize(json, MyDeserialParent.class)
) i wywołać program ustawiający z instancją MyChildInterface
. To źle się czuje, tak jakbym czegoś przegapił. Czy istnieje lepszy sposób?
Czy istnieje również sposób na określenie generycznych (T
na MyDeserialParent
), jeśli ręcznie utworzyć obiekt nadrzędny również? lub Czy Typ Erasure oznacza, że nie ma sposobu, aby to zrobić? (To pytanie jest mniej ważne, ponieważ wiem, że mogę uzyskać bezpieczeństwo typu, jeśli używam konkretnych podtypów MyDeserialParent, które już teraz sugerują T
, ale chciałbym tego uniknąć).
To bardzo bliskie mojemu własnemu rozwiązaniu, a nie inne rozwiązanie, którego szukałem, ale dobra odpowiedź, która obejmie większość osób, które przychodzą tutaj szukając –