Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Kotlin Gson慢速Json反序列化_Android_Kotlin_Retrofit2 - Fatal编程技术网

Android Kotlin Gson慢速Json反序列化

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

我有一个需要反序列化的大型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{
    @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);