Android Kotlin Gson缓慢的Json反序列化
我有一个大的JSON,我不得不反序列化,我只对if的某些部分感兴趣。 我正在使用的Pojos是这样的:
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 } }
改造适配器的相关部分:
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()) }
我正在对300ms的调试报告进行简单的调用。
我的问题是:
-
什么时候应该考虑使用TypeAdapter(我选择性能优于样板,我不介意使用类型适配器编写一些额外的代码行)。 但是我不太明白适配器是什么类型的,我应该在什么情况下使用它们。
-
我的Json结构比我的Character Pojo有更多的属性,我只是意识到使用transient / @Expose或者把它保留在Pojo之外可以得到相同的结果。 那三个有什么区别?
-
当我使用Kotlin时,是否有任何库/扩展可以帮助我处理这种TypeAdapter反序列化的问题?
对我来说,实现一个自定义的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配置中注册如下:
GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(Character.class, new CharacterTypeAdapter()); Gson gson = gsonBuilder.create();
gson实例必须注册Retrofit:
new Retrofit .Builder() .addConverterFactory(GsonConverterFactory.create(gson)) .build() .createApi(Api.class);
你快速反序列化。
- 如何在AndroidStudio中使用Dagger2和Kotlin在其他项目模块中实现接口库
- 如何在Kotlin中注入原始变量?
- 错误:未找到注释处理器'__gen.AnnotationProcessorWrapper_debug_android_databinding_annotationprocessor_ProcessDataBinding'
- 改进API调用:如何确保在进行api调用后该值不为空?
- 错误:com.app.android.dagger.component.AppComponent(unscoped)可能不引用作用域绑定:
- Dagger2将演示者注入到Kotlin Activity错误中
- 匕首2与Kotlin,在ApplicationComponent中返回泛型类型
- 来自Retrofit的POST请求以意想不到的方式工作
- Dagger 2命名不能没有@Provides方法提供