Aktualizacja: Jest https://github.com/acebaggins/gson-serializers która obejmuje wiele kolekcji guava:
ImmutableList
ImmutableSet
ImmutableSortedSet
ImmutableMap
ImmutableSortedMap
Jak napisać pojedynczy Deserializator pracy dla wszystkich ImmutableList?
Pomysł jest prosty, przekształcić przekazany Type
reprezentujący ImmutableList<T>
w Type
reprezentujących List<T>
użyj wbudowany zdolności Gson
„s stworzyć List
i przekonwertować go do ImmutableList
.
class MyJsonDeserializer implements JsonDeserializer<ImmutableList<?>> {
@Override
public ImmutableList<?> deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
final Type type2 = ParameterizedTypeImpl.make(List.class, ((ParameterizedType) type).getActualTypeArguments(), null);
final List<?> list = context.deserialize(json, type2);
return ImmutableList.copyOf(list);
}
}
Istnieje wiele ParameterizedTypeImpl
zajęcia w bibliotekach Java używam, ale żaden z nich przeznaczone są do użytku publicznego. Przetestowałem to pod numerem sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
.
Jak zarejestrować go dla wszystkich ImmutableList?
Ta część jest trywialne, pierwszy argument do rejestracji jest java.lang.reflect.Type
które wprowadzają w błąd mnie do korzystania ParameterizedType
, gdzie po prostu za pomocą Class
ma zadanie:
final Gson gson = new GsonBuilder()
.registerTypeAdapter(ImmutableList.class, myJsonDeserializer)
.create();
możemy uniknąć korzystania z ParameterizedTypeImpl? Na przykład za pomocą smth like: final Lista > list = context.deserialize (json, List.class); –
@Alexander Bezrodniy: Obawiam się, że to niemożliwe. Możesz tego uniknąć, używając 'TypeAdapter>', ale musisz napisać inny kod: 1.Wdróż "write", nawet jeśli wystarczałaby domyślna implementacja, 2. Rozdaj z 'null' w' read'. To wszystko trochę na niskim poziomie. –
maaartinus
Chyba teraz rozumiem twoje pytanie. Nie można pominąć generycznych; bez nich zawartość listy nie może zostać prawidłowo sformatowana. – maaartinus