2016-08-02 42 views
2

我有一個大的JSON,我有反序列化,我只關心,如果某些部分。我使用的是POJO是這樣的:的Android科特林GSON慢的Json反序列化

val retrofit = Retrofit.Builder() 
       .addCallAdapterFactory(rxAdapter) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .baseUrl(BASE_URL) 
       .client(httpClient.build()) 
       .build() 

而且默認地將Impl:

fun getCharacterById(characterID: Int):Observable<Response<List<Character>>> { 
     return apiService.getCharacter(characterID) 
       .subscribeOn(Schedulers.io()) 
    } 

我得到的改造調試報告

data class Response<T>(
     val header: JHeader, 
     val result: T 
) 

data class JHeader(
     val success: Int, 
     val error: List<String> 
) 

class Character{ 
    @SerializedName("id_") val id: Int 
    @SerializedName("levelA") val level: String 
    @SerializedName("a3") val unit: String = "" 

    constructor(id: Int, level: String) { 
     this.id = id 
     this.level= level 
    } 
} 

改造適配器的有關部分只需300ms即可撥打此服務。

我的問題是:

  • 當我應該考慮使用TypeAdapter(我選擇性能比樣板,我不介意編寫代碼型適配器一些額外的線)。但我不太明白適配器是什麼類型的,我應該在什麼情況下使用它們。

  • 我的Json結構比我的Character Pojo有更多的屬性,我只是意識到使用transient/@Expose或者將它保留在Pojo之外導致相同的結果。這3個之間有什麼區別嗎?

  • ,因爲我使用科特林,是否有任何庫/擴展,幫我處理這個TypeAdapter反序列化的東西?

+0

我現在面臨着類似的問題。您的http響應有多少個字節? – ngu

+0

200 OK(303ms),END HTTP(49063字節體) –

回答

1

對我來說,實施自定義TypeAdapter是一個巨大的性能提升。我對每個需要大量反序列化的類使用類型適配器。在你的榜樣,這將是(在Java中):

public class CharacterTypeAdapter extends TypeAdapter<Character> { 
    @Override 
    public void write(final JsonWriter out, final Character character) throws IOException { 
     out.beginObject(); 
     out.name("id").value(character.getId()); 
     out.name("level").value(character.getLevel()); 
     out.name("unit").value(character.getUnit()); 
     out.endObject(); 
    } 

    @Override 
    public Character read(final JsonReader in) throws IOException { 
     Character character = new Character(); 
     in.beginObject(); 
     while(in.hasNext()){ 
      switch(in.nextName()){ 
       case "id": 
        character.setId(in.nextInt()); 
        break; 
       case "level": 
        character.setId(in.nextString()); 
        break; 
       case "unit": 
        character.setId(in.nextString()); 
        break; 
      } 
     } 
     in.endObject(); 

     return character; 
    } 
} 

TypeAdapter必須在GSON配置中進行登記如下:

new Retrofit 
    .Builder() 
    .addConverterFactory(GsonConverterFactory.create(gson)) 
    .build() 
    .createApi(Api.class); 

GsonBuilder gsonBuilder = new GsonBuilder(); 
gsonBuilder.registerTypeAdapter(Character.class, new CharacterTypeAdapter()); 
Gson gson = gsonBuilder.create(); 

的GSON實例必須與改造登記

您得到極快的反序列化。

+0

亞我已經意識到這可能是類似的東西,但我想我得到了相同的結果,我不知道,如果它是很慢的服務器,我有沒有辦法基準默認的json反序列化。任何想法如何衡量它? –

+0

由於某種原因,兒子不使用我的類型適配器。奇怪的。 –

+1

似乎具有用於其對象的自定義TypeAdapter的泛型列表不會被識別,因此使用默認的反序列化器。任何解決方法? –