Skip to content

Commit 4f3b782

Browse files
committed
Implementation in Converter, replacing Serializer
Related to FasterXML#671, FasterXML#674.
1 parent 81e9700 commit 4f3b782

File tree

3 files changed

+23
-10
lines changed

3 files changed

+23
-10
lines changed

src/main/kotlin/com/fasterxml/jackson/module/kotlin/Converters.kt

+12
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,21 @@
11
package com.fasterxml.jackson.module.kotlin
22

3+
import com.fasterxml.jackson.databind.JavaType
34
import com.fasterxml.jackson.databind.ser.std.StdDelegatingSerializer
5+
import com.fasterxml.jackson.databind.type.TypeFactory
46
import com.fasterxml.jackson.databind.util.StdConverter
57
import kotlin.reflect.KClass
68

9+
internal class SequenceToIteratorConverter(private val input: JavaType) : StdConverter<Sequence<*>, Iterator<*>>() {
10+
override fun convert(value: Sequence<*>): Iterator<*> = value.iterator()
11+
12+
override fun getInputType(typeFactory: TypeFactory): JavaType = input
13+
// element-type may not be obtained, so a null check is required
14+
override fun getOutputType(typeFactory: TypeFactory): JavaType = input.containedType(0)
15+
?.let { typeFactory.constructCollectionLikeType(Iterator::class.java, it) }
16+
?: typeFactory.constructType(Iterator::class.java)
17+
}
18+
719
// S is nullable because value corresponds to a nullable value class
820
// @see KotlinNamesAnnotationIntrospector.findNullSerializer
921
internal class ValueClassBoxConverter<S : Any?, D : Any>(

src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinAnnotationIntrospector.kt

+11-3
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,17 @@ internal class KotlinAnnotationIntrospector(private val context: Module.SetupCon
6464
return super.findCreatorAnnotation(config, a)
6565
}
6666

67-
// Find a converter to handle the case where the getter returns an unboxed value from the value class.
68-
override fun findSerializationConverter(a: Annotated): Converter<*, *>? = (a as? AnnotatedMethod)?.let { _ ->
69-
cache.findValueClassReturnType(a)?.let { cache.getValueClassBoxConverter(a.rawReturnType, it) }
67+
override fun findSerializationConverter(a: Annotated): Converter<*, *>? = when (a) {
68+
// Find a converter to handle the case where the getter returns an unboxed value from the value class.
69+
is AnnotatedMethod -> cache.findValueClassReturnType(a)
70+
?.let { cache.getValueClassBoxConverter(a.rawReturnType, it) }
71+
?: a.takeIf { Sequence::class.java.isAssignableFrom(it.rawType) }
72+
?.let { SequenceToIteratorConverter(it.type) }
73+
74+
is AnnotatedClass -> a
75+
.takeIf { Sequence::class.java.isAssignableFrom(it.rawType) }
76+
?.let { SequenceToIteratorConverter(it.type) }
77+
else -> null
7078
}
7179

7280
// Determine if the unbox result of value class is nullAable

src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinSerializers.kt

-7
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,6 @@ import java.lang.reflect.Method
1313
import java.lang.reflect.Modifier
1414
import java.math.BigInteger
1515

16-
object SequenceSerializer : StdSerializer<Sequence<*>>(Sequence::class.java) {
17-
override fun serialize(value: Sequence<*>, gen: JsonGenerator, provider: SerializerProvider) {
18-
provider.defaultSerializeValue(value.iterator(), gen)
19-
}
20-
}
21-
2216
object UByteSerializer : StdSerializer<UByte>(UByte::class.java) {
2317
override fun serialize(value: UByte, gen: JsonGenerator, provider: SerializerProvider) =
2418
gen.writeNumber(value.toShort())
@@ -98,7 +92,6 @@ internal class KotlinSerializers : Serializers.Base() {
9892
val rawClass = type.rawClass
9993

10094
return when {
101-
Sequence::class.java.isAssignableFrom(rawClass) -> SequenceSerializer
10295
UByte::class.java.isAssignableFrom(rawClass) -> UByteSerializer
10396
UShort::class.java.isAssignableFrom(rawClass) -> UShortSerializer
10497
UInt::class.java.isAssignableFrom(rawClass) -> UIntSerializer

0 commit comments

Comments
 (0)