Update: Там в https://github.com/acebaggins/gson-serializers, которая охватывает многие коллекции гуавы:
ImmutableList
ImmutableSet
ImmutableSortedSet
ImmutableMap
ImmutableSortedMap
Как написать один десериализатор работает для всех ImmutableList?
Идея проста, преобразование прошло Type
, представляющий ImmutableList<T>
в Type
, представляющий List<T>
, использовать встроенные возможности Gson
«s создать List
и преобразовать его к 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);
}
}
Есть несколько ParameterizedTypeImpl
классов в Java библиотеки, которые я использую, но ни один из них не предназначен для публичного использования. Я тестировал его с помощью sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
.
Как зарегистрировать его для всех ImmutableList?
Та часть тривиальна, то первый аргумент для регистрации является java.lang.reflect.Type
, которые вводят в заблуждение меня к использованию ParameterizedType
, где просто используя Class
делает работу:
final Gson gson = new GsonBuilder()
.registerTypeAdapter(ImmutableList.class, myJsonDeserializer)
.create();
Можем ли мы избежать использования параметра ParameterizedTypeImpl? Например, используя smth like: final Список > list = context.deserialize (json, List.class); –
@ Александр Безродный: Боюсь, это невозможно. Вы можете избежать всего этого, используя 'TypeAdapter>', но тогда вам нужно написать еще один шаблонный код: 1.Реализуйте 'write', хотя реализация по умолчанию будет достаточной, 2. Поделитесь с' null' в 'read'. Все это немного низкоуровневое. –
maaartinus
Думаю, теперь я понимаю ваш вопрос. Вы не можете игнорировать дженерики; без них содержимое списка нельзя десериализовать должным образом. – maaartinus