[KxSerialization] Fix NPE if sealed class has self-referencing in generic parameter

Fixes #KT-58918

If the serializable class contains itself as a generic parameter of the property, and its serializer is not an object (for example, for a sealed class), in this case there is a race in the initialization of the serializer and child serializers.

Merge-request: KT-MR-10363
Merged-by: Sergey Shanshin <Sergey.Shanshin@jetbrains.com>
This commit is contained in:
Sergey.Shanshin
2023-06-01 12:01:04 +00:00
committed by Space Team
parent e180296f0e
commit 13e2a3ae94
2 changed files with 32 additions and 0 deletions
+16
View File
@@ -17,6 +17,20 @@ open class Open(val p: Open? = null)
@Serializable
abstract class Abstract(val p: Abstract? = null)
@Serializable
class GenericHolder<T> {
var value: T? = null
}
@Serializable
sealed class SealedGeneric {
var holder = GenericHolder<SealedGeneric>()
}
@Serializable
sealed class SealedListGeneric {
var holder = GenericHolder<GenericHolder<List<SealedListGeneric>>>()
}
fun box(): String {
// A correctly cached class must be initialized correctly in order to exclude cyclic nesting of caches
@@ -24,6 +38,8 @@ fun box(): String {
Sealed.serializer()
Open.serializer()
Abstract.serializer()
SealedGeneric.serializer()
SealedListGeneric.serializer()
return "OK"
}