Android Kotlin Gson慢速Json反序列化
我有一个需要反序列化的大型json,我只对if的某些部分感兴趣。我使用的POJO如下所示:Android Kotlin Gson慢速Json反序列化,android,kotlin,retrofit2,Android,Kotlin,Retrofit2,我有一个需要反序列化的大型json,我只对if的某些部分感兴趣。我使用的POJO如下所示: data class Response<T>( val header: JHeader, val result: T ) data class JHeader( val success: Int, val error: List<String> ) class Character{ @SerializedN
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
}
}
和Impl:
fun getCharacterById(characterID: Int):Observable<Response<List<Character>>> {
return apiService.getCharacter(characterID)
.subscribeOn(Schedulers.io())
}
fun getCharacterById(characterID:Int):可观察{
返回apiService.getCharacter(characterID)
.subscribeOn(Schedulers.io())
}
我得到改装调试报告的300ms为一个简单的调用这个服务
我的问题是:
-
< >我应该考虑何时使用TypeAdapter(我选择性能优于样板,我不介意用代码适配器写几行代码)。但我不太明白类型适配器是用来做什么的,在什么情况下我应该使用它们
- 我的Json结构比我的角色Pojo有更多的属性,我只是意识到使用transient/@Expose或将其排除在Pojo之外会导致相同的结果。这三个之间有什么区别吗
- 在我使用Kotlin时,是否有任何库/扩展可以帮助我处理这个TypeAdapter反序列化的东西
- 对我来说,实现一个定制的
类型适配器是一个巨大的性能提升。我为每个需要大量反序列化的类使用类型适配器。在您的示例中(在Java中):
gson实例必须注册到改装:
new Retrofit
.Builder()
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
.createApi(Api.class);
反序列化速度非常快。我现在也面临类似的问题。你的http响应有多少字节?200 OK(303ms),END http(49063字节体)是的,我意识到可能是这样的,但我想我得到了相同的结果,我不知道是不是服务器速度慢,我没有办法对默认的json反序列化进行基准测试。知道怎么测量吗?不知什么原因,儿子没有用我的类型适配器。奇怪的是,似乎无法识别带有自定义TypeAdapter对象的泛型列表,因此使用了默认的反序列化程序。有什么解决办法吗?我不能确认。我也用它来做一般列表。我看到的唯一区别是,我的改型api方法没有将结果封装在响应
对象中,即可观察
而不是可观察
。我不知道这是否会对反序列化产生影响。我几乎可以肯定:p但是还没有找到解决方案
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;
}
}
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Character.class, new CharacterTypeAdapter());
Gson gson = gsonBuilder.create();
new Retrofit
.Builder()
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
.createApi(Api.class);