微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java.lang.VerifyError:验证器被拒绝拒绝调用,预期 36 个参数寄存器,方法签名有 37 个或更多

如何解决java.lang.VerifyError:验证器被拒绝拒绝调用,预期 36 个参数寄存器,方法签名有 37 个或更多

当我试图解码一堆表示为字符串的 json 数据时,它崩溃并说:

java.lang.VerifyError: Verifier rejected class com.example.package.MySampleClass$$serializer: Failed to verify: 
com.example.package.MySampleClass com.example.package.MySampleClass 
$$serializer.deserialize(kotlinx.serialization.encoding.Decoder):
[0x1E18] Rejecting invocation,expected 36 argument registers,method signature has 37 or more (declaration of 
'com.example.package.MySampleClass $$serializer' appears in 
/data/data/com.example.package/code_cache/.overlay/base.apk/classes11.dex)

复制

  val response = httpClient.get<HttpResponse>(ApiEndPoints.languages)
  val result = response.readText()
  val jsElement = Json.parsetoJsonElement(result)
  val  arr = (jsElement as JsonObject)["data"] as JsonArray
  arr.forEach {
   //    I tried to use 3 different ways but all of them causes the same error.
         val example1 = Json{ignoreUnkNownKeys = true}.decodeFromString<LanguageData>(it.toString()) 
   //    val example2 = Json.decodeFromJsonElement(LanguageData.serializer(),it)
   //    val example3 = Json.decodeFromJsonElement<LanguageData>(it)
  }


@Serializable
data class LanguageData(
  @SerialName("code")
    val code: String,@SerialName("flag")
    val flag: String,@SerialName("keys")
    val keys: Keys,@SerialName("name")
    val name: String
)
@Serializable
data class Keys(
@SerialName("AlertMessages")
    val alertMessages: AlertMessages,@SerialName("Alerts")
    val alerts: Alerts,@SerialName("SampleKey1")
    val sampleKey1: SampleKey1,@SerialName("SampleKey2")
    val sampleKey2: SampleKey2
    ...
    @SerialName("MySampleClass")
    val mySampleClass: MySampleClass
)

每个可序列化的类都有 200 多个字段。 附注 如果我使用 LanguageData 而不是 HttpResponse

作为返回类型,则没有区别

预期行为 将 jsonString 响应解码为 LanguageData。 环境

  • Kotlin 版本:1.4.31
  • Kotlin 序列化库版本:1.1.0
  • Kotlin 平台:JVM、本机
  • Gradle 版本:4.2.0-beta06

更新 1.0

我已经删除了除 MySampleClass 之外的所有关键类,并且还从该类中删除了一堆字段(有​​ ~300,现在我只有 ~20 个字段),现在它可以工作了。

似乎有一些字段数量限制,但我该如何解决该问题?

更新 1.1

用 Gson 和 moshi 尝试过,但它抛出了同样的错误。似乎不是 Kotlinx.serialization 库问题

Gson().fromJson(jsonString,MySampleClass::class.java)

val adapter: JsonAdapter<MySampleClass> = moshi.adapter(MySampleClass::class.java)
    val result = adapter.fromJson(jsonString)

更新 2.0

问题出现在 Kotlin 数据类中,似乎 jvm 类构造函数最多可以接受 ~244 个字段,现在我已经用“sample”类更改了我的数据类,它使用 Gson 也可以工作尝试使用 reflection 进行我自己的解析并且它也有效,但是使用 Kotlinx.serialization 仍然会引发相同的错误

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。