Skip to content

Commit 8d80860

Browse files
committed
add ValueClassBoxSerializer
1 parent 1bc121d commit 8d80860

File tree

1 file changed

+18
-0
lines changed

1 file changed

+18
-0
lines changed

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.SerializerProvider
99
import com.fasterxml.jackson.databind.ser.Serializers
1010
import com.fasterxml.jackson.databind.ser.std.StdSerializer
1111
import java.math.BigInteger
12+
import kotlin.reflect.KClass
1213

1314
object SequenceSerializer : StdSerializer<Sequence<*>>(Sequence::class.java) {
1415
override fun serialize(value: Sequence<*>, gen: JsonGenerator, provider: SerializerProvider) {
@@ -71,3 +72,20 @@ internal class KotlinSerializers : Serializers.Base() {
7172
else -> null
7273
}
7374
}
75+
76+
// This serializer is used to properly serialize the value class.
77+
// The getter generated for the value class is special,
78+
// so this class will not work properly when added to the Serializers
79+
// (it is configured from KotlinAnnotationIntrospector.findSerializer).
80+
internal class ValueClassBoxSerializer(
81+
outerClazz: KClass<Any>, innerClazz: Class<*>
82+
) : StdSerializer<Any>(outerClazz.java) {
83+
private val boxMethod = _handledType.getMethod("box-impl", innerClazz)
84+
85+
override fun serialize(value: Any, gen: JsonGenerator, provider: SerializerProvider) {
86+
// Values retrieved from getter are considered validated and constructor-impl is not executed.
87+
val boxed = boxMethod.invoke(null, value)
88+
89+
provider.findValueSerializer(_handledType).serialize(boxed, gen, provider)
90+
}
91+
}

0 commit comments

Comments
 (0)