Skip to content

Commit 41dd67c

Browse files
authored
Merge pull request #733 from k163377/serializable-object-read-resolve
Fix problem with Serializable objects not implementing readResolve
2 parents e827417 + 2306408 commit 41dd67c

File tree

6 files changed

+43
-0
lines changed

6 files changed

+43
-0
lines changed

release-notes/CREDITS-2.x

+5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ Contributors:
1717

1818
# 2.17.0 (not yet released)
1919

20+
# 2.16.1 (not yet released)
21+
22+
WrongWrong (@k163377)
23+
* #733: Fix problem with Serializable objects not implementing readResolve
24+
2025
# 2.16.0
2126

2227
kkurczewski

release-notes/VERSION-2.x

+4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ Co-maintainers:
1616
=== Releases ===
1717
------------------------------------------------------------------------
1818

19+
2.16.1 (not yet released)
20+
21+
#733: Fix problem with Serializable objects not implementing readResolve.
22+
1923
2.16.0 (15-Nov-2023)
2024

2125
#707: If JsonSetter(nulls = Nulls.SKIP) is specified, the default argument is now used when null.

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

+12
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,16 @@ import com.fasterxml.jackson.databind.deser.std.StdDeserializer
1313
import kotlin.time.Duration as KotlinDuration
1414

1515
object SequenceDeserializer : StdDeserializer<Sequence<*>>(Sequence::class.java) {
16+
private fun readResolve(): Any = SequenceDeserializer
17+
1618
override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Sequence<*> {
1719
return ctxt.readValue(p, List::class.java).asSequence()
1820
}
1921
}
2022

2123
object RegexDeserializer : StdDeserializer<Regex>(Regex::class.java) {
24+
private fun readResolve(): Any = RegexDeserializer
25+
2226
override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Regex {
2327
val node = ctxt.readTree(p)
2428

@@ -43,6 +47,8 @@ object RegexDeserializer : StdDeserializer<Regex>(Regex::class.java) {
4347
}
4448

4549
object UByteDeserializer : StdDeserializer<UByte>(UByte::class.java) {
50+
private fun readResolve(): Any = UByteDeserializer
51+
4652
override fun deserialize(p: JsonParser, ctxt: DeserializationContext) =
4753
p.shortValue.asUByte() ?: throw InputCoercionException(
4854
p,
@@ -53,6 +59,8 @@ object UByteDeserializer : StdDeserializer<UByte>(UByte::class.java) {
5359
}
5460

5561
object UShortDeserializer : StdDeserializer<UShort>(UShort::class.java) {
62+
private fun readResolve(): Any = UShortDeserializer
63+
5664
override fun deserialize(p: JsonParser, ctxt: DeserializationContext) =
5765
p.intValue.asUShort() ?: throw InputCoercionException(
5866
p,
@@ -63,6 +71,8 @@ object UShortDeserializer : StdDeserializer<UShort>(UShort::class.java) {
6371
}
6472

6573
object UIntDeserializer : StdDeserializer<UInt>(UInt::class.java) {
74+
private fun readResolve(): Any = UIntDeserializer
75+
6676
override fun deserialize(p: JsonParser, ctxt: DeserializationContext) =
6777
p.longValue.asUInt() ?: throw InputCoercionException(
6878
p,
@@ -73,6 +83,8 @@ object UIntDeserializer : StdDeserializer<UInt>(UInt::class.java) {
7383
}
7484

7585
object ULongDeserializer : StdDeserializer<ULong>(ULong::class.java) {
86+
private fun readResolve(): Any = ULongDeserializer
87+
7688
override fun deserialize(p: JsonParser, ctxt: DeserializationContext) =
7789
p.bigIntegerValue.asULong() ?: throw InputCoercionException(
7890
p,

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

+10
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import com.fasterxml.jackson.databind.deser.std.StdKeyDeserializers
1010
// If StdKeyDeserializer is modified, need to modify this too.
1111

1212
internal object UByteKeyDeserializer : StdKeyDeserializer(TYPE_SHORT, UByte::class.java) {
13+
private fun readResolve(): Any = UByteKeyDeserializer
14+
1315
override fun deserializeKey(key: String?, ctxt: DeserializationContext): UByte? = super.deserializeKey(key, ctxt)
1416
?.let {
1517
(it as Short).asUByte() ?: throw InputCoercionException(
@@ -22,6 +24,8 @@ internal object UByteKeyDeserializer : StdKeyDeserializer(TYPE_SHORT, UByte::cla
2224
}
2325

2426
internal object UShortKeyDeserializer : StdKeyDeserializer(TYPE_INT, UShort::class.java) {
27+
private fun readResolve(): Any = UShortKeyDeserializer
28+
2529
override fun deserializeKey(key: String?, ctxt: DeserializationContext): UShort? = super.deserializeKey(key, ctxt)
2630
?.let {
2731
(it as Int).asUShort() ?: throw InputCoercionException(
@@ -34,6 +38,8 @@ internal object UShortKeyDeserializer : StdKeyDeserializer(TYPE_INT, UShort::cla
3438
}
3539

3640
internal object UIntKeyDeserializer : StdKeyDeserializer(TYPE_LONG, UInt::class.java) {
41+
private fun readResolve(): Any = UIntKeyDeserializer
42+
3743
override fun deserializeKey(key: String?, ctxt: DeserializationContext): UInt? = super.deserializeKey(key, ctxt)
3844
?.let {
3945
(it as Long).asUInt() ?: throw InputCoercionException(
@@ -47,6 +53,8 @@ internal object UIntKeyDeserializer : StdKeyDeserializer(TYPE_LONG, UInt::class.
4753

4854
// kind parameter is dummy.
4955
internal object ULongKeyDeserializer : StdKeyDeserializer(TYPE_LONG, ULong::class.java) {
56+
private fun readResolve(): Any = ULongKeyDeserializer
57+
5058
override fun deserializeKey(key: String?, ctxt: DeserializationContext): ULong? = key?.let {
5159
it.toBigInteger().asULong() ?: throw InputCoercionException(
5260
null,
@@ -58,6 +66,8 @@ internal object ULongKeyDeserializer : StdKeyDeserializer(TYPE_LONG, ULong::clas
5866
}
5967

6068
internal object KotlinKeyDeserializers : StdKeyDeserializers() {
69+
private fun readResolve(): Any = KotlinKeyDeserializers
70+
6171
override fun findKeyDeserializer(
6272
type: JavaType,
6373
config: DeserializationConfig?,

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

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import java.lang.reflect.Method
1313
import java.lang.reflect.Modifier
1414

1515
internal object ValueClassUnboxKeySerializer : StdSerializer<Any>(Any::class.java) {
16+
private fun readResolve(): Any = ValueClassUnboxKeySerializer
17+
1618
override fun serialize(value: Any, gen: JsonGenerator, provider: SerializerProvider) {
1719
val method = value::class.java.getMethod("unbox-impl")
1820
val unboxed = method.invoke(value)

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

+10
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,29 @@ object SequenceSerializer : StdSerializer<Sequence<*>>(Sequence::class.java) {
2424
}
2525

2626
object UByteSerializer : StdSerializer<UByte>(UByte::class.java) {
27+
private fun readResolve(): Any = UByteSerializer
28+
2729
override fun serialize(value: UByte, gen: JsonGenerator, provider: SerializerProvider) =
2830
gen.writeNumber(value.toShort())
2931
}
3032

3133
object UShortSerializer : StdSerializer<UShort>(UShort::class.java) {
34+
private fun readResolve(): Any = UShortSerializer
35+
3236
override fun serialize(value: UShort, gen: JsonGenerator, provider: SerializerProvider) =
3337
gen.writeNumber(value.toInt())
3438
}
3539

3640
object UIntSerializer : StdSerializer<UInt>(UInt::class.java) {
41+
private fun readResolve(): Any = UIntSerializer
42+
3743
override fun serialize(value: UInt, gen: JsonGenerator, provider: SerializerProvider) =
3844
gen.writeNumber(value.toLong())
3945
}
4046

4147
object ULongSerializer : StdSerializer<ULong>(ULong::class.java) {
48+
private fun readResolve(): Any = ULongSerializer
49+
4250
override fun serialize(value: ULong, gen: JsonGenerator, provider: SerializerProvider) {
4351
val longValue = value.toLong()
4452
when {
@@ -54,6 +62,8 @@ private fun Class<*>.getStaticJsonValueGetter(): Method? = this.declaredMethods.
5462
}
5563

5664
object ValueClassUnboxSerializer : StdSerializer<Any>(Any::class.java) {
65+
private fun readResolve(): Any = ValueClassUnboxSerializer
66+
5767
override fun serialize(value: Any, gen: JsonGenerator, provider: SerializerProvider) {
5868
val unboxed = value::class.java.getMethod("unbox-impl").invoke(value)
5969

0 commit comments

Comments
 (0)