Skip to content

Commit 3289fb2

Browse files
committed
Partially implement storing the map from polymorphic subclasses to polymorphic numbers in SerializersModule
This may not improve performance much so it's dropped for now.
1 parent d8e06b2 commit 3289fb2

File tree

2 files changed

+20
-9
lines changed

2 files changed

+20
-9
lines changed

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,17 @@ public abstract class AbstractPolymorphicSerializer<T : Any> internal constructo
3131

3232
public final override fun serialize(encoder: Encoder, value: T) {
3333
val actualSerializer = findPolymorphicSerializer(encoder, value)
34+
val serialPolymorphicNumberInSerializersModule = if (descriptor.useSerialPolymorphicNumbers)
35+
findSerialPolymorphicNumberOrNull(encoder, value)
36+
else
37+
null
3438
encoder.encodeStructure(descriptor) {
3539
if (descriptor.useSerialPolymorphicNumbers)
3640
encodeIntElement(
3741
descriptor,
3842
0,
39-
// it seems not possible to cache this with the current implementation that serializers are completely separated from serializers modules
40-
actualSerializer.descriptor.serialPolymorphicNumberByBaseClass.getValue(baseClass)
43+
serialPolymorphicNumberInSerializersModule
44+
?: actualSerializer.descriptor.serialPolymorphicNumberByBaseClass.getValue(baseClass)
4145
)
4246
else
4347
encodeStringElement(descriptor, 0, actualSerializer.descriptor.serialName)
@@ -125,6 +129,16 @@ public abstract class AbstractPolymorphicSerializer<T : Any> internal constructo
125129
value: T
126130
): SerializationStrategy<T>? =
127131
encoder.serializersModule.getPolymorphic(baseClass, value)
132+
133+
/**
134+
* TODO
135+
*/
136+
@InternalSerializationApi
137+
public fun <T : Any> AbstractPolymorphicSerializer<T>.findSerialPolymorphicNumberOrNull(
138+
encoder: Encoder,
139+
value: T
140+
): Int? =
141+
encoder.serializersModule.getSerialPolymorphicNumber(baseClass, value)
128142
}
129143

130144
@JvmName("throwSubtypeNotRegistered")

core/commonMain/src/kotlinx/serialization/modules/SerializersModule.kt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,8 @@ public sealed class SerializersModule {
6969
baseClass: KClass<in T>, serializedNumber: Int?
7070
): DeserializationStrategy<T>?
7171

72-
// TODO remove or use
73-
// TODO old design for cashing serializers by number in `AbstractPolymorphicSerializer` which probably doesn't work and is not needed
7472
@ExperimentalSerializationApi
75-
public abstract fun <T : Any> getPolymorphicForAllSubclasses(baseClass: KClass<T>): Map<KClass<out T>, KSerializer<out T>>
73+
public abstract fun <T : Any> getSerialPolymorphicNumber(baseClass: KClass<in T>, value: T): Int?
7674

7775
/**
7876
* Copies contents of this module to the given [collector].
@@ -203,10 +201,9 @@ internal class SerialModuleImpl(
203201
)
204202
}
205203

206-
// TODO remove or use
207-
@ExperimentalSerializationApi
208-
override fun <T : Any> getPolymorphicForAllSubclasses(baseClass: KClass<T>): Map<KClass<out T>, KSerializer<out T>> =
209-
polyBase2Serializers.getValue(baseClass) as Map<KClass<out T>, KSerializer<out T>>
204+
override fun <T : Any> getSerialPolymorphicNumber(baseClass: KClass<in T>, value: T): Int? {
205+
TODO("Not yet implemented")
206+
}
210207

211208
override fun <T : Any> getContextual(kClass: KClass<T>, typeArgumentsSerializers: List<KSerializer<*>>): KSerializer<T>? {
212209
return (class2ContextualFactory[kClass]?.invoke(typeArgumentsSerializers)) as? KSerializer<T>?

0 commit comments

Comments
 (0)