2012-06-04 3 views
1

Можно создать дубликат:
deserializing generics with gsonGSON дженерики сериализации

Так что мне нужно сделать:

Type fluentType = new TypeToken<BruteForceFluentImpl<GtlDigestor.Data>>() {}.getType(); 

вместо

Type fluentType = new TypeToken<Fluent<T>>() {}.getType(); // <-- i want to be able to do something like this. 

String json = gson.toJson(fluent, fluentType); 

Это означает, что каждый раз, когда мне нужно указать другой тип параметра для класса Fluent, мне нужно изменить свой код, чтобы указать его. Прямо сейчас параметр типа GtlDigestor.Data.

Как это сделать? (вторая строка кода не будет работать)

+0

dup of http://stackoverflow.com/questions/4364392/deserializing-generics-with-gson? – MrJames

ответ

2

Вы должны указать Gson фактический параметризованный тип (например, BruteForceFluentImpl<GtlDigestor.Data>, включая фактический тип времени выполнения и фактическое значение параметра типа) во время выполнения, поскольку Gson необходимо сохранить этот Информация.

Использование TypeToken это самый простой способ получить Type, но и использовать его, вы должны жестко закодировать точный тип в источнике (без параметров типа, как T). Если вы хотите поместить код в метод, который будет повторно использоваться с разными типами, то, возможно, этот метод должен принять значение Type в качестве параметра, который должен передать вызывающий. Тип может быть жестко закодирован в местоположение вызывающего абонента, каждый из которых предположительно использует только фиксированный тип.

Или, если вам необходимо полностью создать Type во время выполнения на основе исходных параметров типа и типа, см. Мой ответ на вопрос here.

Смежные вопросы