Skip to content

Commit 257749e

Browse files
committed
Force polymorphic serialization in serialization tests
This ensures type information is always embedded in the serialized form. The "unknown type" serializers depend on this. Currently unknown type serializers always embed type information, but this should not be a requirement. A functionally correct implementation should only embed it in the case of polymorphic serialization.
1 parent 3dd692a commit 257749e

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

carp.test/src/commonMain/kotlin/dk/cachet/carp/test/serialization/ConcreteTypesSerializationTest.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,13 @@ abstract class ConcreteTypesSerializationTest(
4949
for ( toSerialize in instancesToSerialize )
5050
{
5151
// Get serializer.
52+
// Polymorphic serializer is used to ensure type information is always embedded,
53+
// which some deserializers may depend upon.
5254
val type = toSerialize::class
55+
val registration = polymorphicSerializers[ type ]
56+
assertNotNull( registration, "No serializer registered for type '$type'" )
5357
@Suppress( "UNCHECKED_CAST" )
54-
val serializer = polymorphicSerializers[ type ] as? KSerializer<Any>
55-
assertNotNull( serializer, "No serializer registered for type '$type'" )
58+
val serializer = PolymorphicSerializer( registration.baseKlass ) as KSerializer<Any>
5659

5760
// Verify whether serializing and deserializing the instance results in the same object.
5861
val serialized = json.encodeToString( serializer, toSerialize )
@@ -67,12 +70,12 @@ abstract class ConcreteTypesSerializationTest(
6770
* Get a map which holds the [KSerializer] for each [KClass] registered for polymorphic serialization in [serialModule].
6871
*/
6972
@ExperimentalSerializationApi
70-
fun getPolymorphicSerializers( serialModule: SerializersModule ): Map<KClass<*>, KSerializer<*>>
73+
fun getPolymorphicSerializers( serialModule: SerializersModule ): Map<KClass<*>, PolymorphicRegistration>
7174
{
7275
val collector =
7376
object : SerializersModuleCollector
7477
{
75-
val serializers: MutableMap<KClass<*>, KSerializer<*>> = mutableMapOf()
78+
val serializers: MutableMap<KClass<*>, PolymorphicRegistration> = mutableMapOf()
7679

7780
override fun <T : Any> contextual(
7881
kClass: KClass<T>,
@@ -85,7 +88,7 @@ fun getPolymorphicSerializers( serialModule: SerializersModule ): Map<KClass<*>,
8588
actualSerializer: KSerializer<Sub>
8689
)
8790
{
88-
serializers[ actualClass ] = actualSerializer
91+
serializers[ actualClass ] = PolymorphicRegistration( baseClass, actualSerializer )
8992
}
9093

9194
@Suppress( "REDUNDANT_PROJECTION", "KotlinRedundantDiagnosticSuppress" ) // Exact override needed.
@@ -109,3 +112,6 @@ fun getPolymorphicSerializers( serialModule: SerializersModule ): Map<KClass<*>,
109112
serialModule.dumpTo( collector )
110113
return collector.serializers
111114
}
115+
116+
117+
data class PolymorphicRegistration( val baseKlass: KClass<*>, val serializer: KSerializer<*> )

0 commit comments

Comments
 (0)