Skip to content

Commit 8007574

Browse files
recursive-rat4Pavel Vasin
andauthored
ObjectSerializer: Respect sequential decoding (#2273)
This was broken in #1916 Since ObjectSerializer calls decodeElementIndex() now, it should also call decodeSequentially(). Co-authored-by: Pavel Vasin <git@vasin.nl>
1 parent 0a6eb81 commit 8007574

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

core/commonMain/src/kotlinx/serialization/internal/ObjectSerializer.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ internal class ObjectSerializer<T : Any>(serialName: String, private val objectI
4141

4242
override fun deserialize(decoder: Decoder): T {
4343
decoder.decodeStructure(descriptor) {
44+
if (decodeSequentially())
45+
return@decodeStructure
46+
4447
when (val index = decodeElementIndex(descriptor)) {
4548
CompositeDecoder.DECODE_DONE -> {
4649
return@decodeStructure
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Copyright 2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package kotlinx.serialization.internal
6+
7+
import kotlinx.serialization.*
8+
import kotlinx.serialization.descriptors.*
9+
import kotlinx.serialization.encoding.*
10+
import kotlinx.serialization.modules.*
11+
12+
/**
13+
* The purpose of this decoder is to check whether its methods were called currectly,
14+
* rather than implement any concrete format.
15+
*/
16+
class DummySequentialDecoder(
17+
override val serializersModule: SerializersModule = EmptySerializersModule()
18+
) : Decoder, CompositeDecoder {
19+
private fun notImplemented(): Nothing = throw Error("Implement this method if needed")
20+
21+
override fun decodeSequentially(): Boolean = true
22+
override fun decodeElementIndex(descriptor: SerialDescriptor): Int = throw Error("This method shouldn't be called in sequential mode")
23+
24+
override fun beginStructure(descriptor: SerialDescriptor): CompositeDecoder = this
25+
override fun endStructure(descriptor: SerialDescriptor): Unit = Unit
26+
27+
override fun decodeInline(descriptor: SerialDescriptor): Decoder = notImplemented()
28+
29+
override fun decodeBoolean(): Boolean = notImplemented()
30+
override fun decodeByte(): Byte = notImplemented()
31+
override fun decodeShort(): Short = notImplemented()
32+
override fun decodeInt(): Int = notImplemented()
33+
override fun decodeLong(): Long = notImplemented()
34+
override fun decodeFloat(): Float = notImplemented()
35+
override fun decodeDouble(): Double = notImplemented()
36+
override fun decodeChar(): Char = notImplemented()
37+
override fun decodeString(): String = notImplemented()
38+
override fun decodeEnum(enumDescriptor: SerialDescriptor): Int = notImplemented()
39+
40+
override fun decodeNotNullMark(): Boolean = notImplemented()
41+
override fun decodeNull(): Nothing? = notImplemented()
42+
43+
override fun decodeBooleanElement(descriptor: SerialDescriptor, index: Int): Boolean = notImplemented()
44+
override fun decodeByteElement(descriptor: SerialDescriptor, index: Int): Byte = notImplemented()
45+
override fun decodeShortElement(descriptor: SerialDescriptor, index: Int): Short = notImplemented()
46+
override fun decodeIntElement(descriptor: SerialDescriptor, index: Int): Int = notImplemented()
47+
override fun decodeLongElement(descriptor: SerialDescriptor, index: Int): Long = notImplemented()
48+
override fun decodeFloatElement(descriptor: SerialDescriptor, index: Int): Float = notImplemented()
49+
override fun decodeDoubleElement(descriptor: SerialDescriptor, index: Int): Double = notImplemented()
50+
override fun decodeCharElement(descriptor: SerialDescriptor, index: Int): Char = notImplemented()
51+
override fun decodeStringElement(descriptor: SerialDescriptor, index: Int): String = notImplemented()
52+
53+
override fun decodeInlineElement(descriptor: SerialDescriptor, index: Int): Decoder = notImplemented()
54+
override fun <T : Any?> decodeSerializableElement(descriptor: SerialDescriptor, index: Int, deserializer: DeserializationStrategy<T>, previousValue: T?): T = notImplemented()
55+
override fun <T : Any> decodeNullableSerializableElement(descriptor: SerialDescriptor, index: Int, deserializer: DeserializationStrategy<T?>, previousValue: T?): T? = notImplemented()
56+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
* Copyright 2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package kotlinx.serialization.internal
6+
7+
import kotlin.test.*
8+
import kotlinx.serialization.*
9+
10+
class ObjectSerializerTest {
11+
@Test
12+
fun testSequentialDecoding() {
13+
SimpleObject.serializer().deserialize(DummySequentialDecoder())
14+
}
15+
16+
@Serializable
17+
object SimpleObject
18+
}

0 commit comments

Comments
 (0)