2012-06-04 60 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 http://stackoverflow.com/questions/4364392/deserializing-generics-with-gson? – MrJames

回答

2

您需要在運行時告訴Gson實際的參數化類型(例如BruteForceFluentImpl<GtlDigestor.Data>,包括實際的運行時原始類型和實際的類型參數值),因爲Gson需要保存這個信息。

使用TypeToken是獲得Type,但使用它,你必須硬編碼在源的確切類型(無類型參數,如T)最簡單的方法。如果你想把代碼放入一個將被重用的方法中,那麼可能這個方法應該接受Type作爲調用者需要傳入的參數。然後這個類型可以被硬編碼爲來電者的位置,每個位置大概只使用固定類型。

或者,如果您需要在運行時根據原始類型和類型參數完全動態生成Type,請參閱我對問題here的回答。