From 702d8d9fa9b170b1bc6de2519d173cf4b1f0b53e Mon Sep 17 00:00:00 2001 From: Him188 Date: Thu, 19 Mar 2020 11:07:53 +0800 Subject: [PATCH] Fix optional element detecting --- .../io/serialization/jce/JceDecoder.kt | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/io/serialization/jce/JceDecoder.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/io/serialization/jce/JceDecoder.kt index 337496bff..e32531d14 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/io/serialization/jce/JceDecoder.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/io/serialization/jce/JceDecoder.kt @@ -231,16 +231,24 @@ internal class JceDecoder( override fun decodeSequentially(): Boolean = false override fun decodeElementIndex(descriptor: SerialDescriptor): Int { - val jceHead = jce.currentHeadOrNull ?: return CompositeDecoder.READ_DONE + var jceHead = jce.currentHeadOrNull ?: return CompositeDecoder.READ_DONE if (jceHead.type == Jce.STRUCT_END) { return CompositeDecoder.READ_DONE } - repeat(descriptor.elementsCount) { - val tag = descriptor.getJceTagId(it) - if (tag == jceHead.tag) { - return it + while (!jce.input.endOfInput){ + repeat(descriptor.elementsCount) { + val tag = descriptor.getJceTagId(it) + if (tag == jceHead.tag) { + return it + } } + + jce.skipField(jceHead.type) + if (!jce.prepareNextHead()) { + break + } + jceHead = jce.currentHead } return CompositeDecoder.READ_DONE // optional support