diff options
Diffstat (limited to 'formats/properties/commonMain/src/kotlinx/serialization/properties/Properties.kt')
-rw-r--r-- | formats/properties/commonMain/src/kotlinx/serialization/properties/Properties.kt | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/formats/properties/commonMain/src/kotlinx/serialization/properties/Properties.kt b/formats/properties/commonMain/src/kotlinx/serialization/properties/Properties.kt index 9d411ad6..8760950c 100644 --- a/formats/properties/commonMain/src/kotlinx/serialization/properties/Properties.kt +++ b/formats/properties/commonMain/src/kotlinx/serialization/properties/Properties.kt @@ -53,6 +53,19 @@ public sealed class Properties( protected abstract fun encode(value: Any): Value + @Suppress("UNCHECKED_CAST") + final override fun <T> encodeSerializableValue(serializer: SerializationStrategy<T>, value: T) { + if (serializer is AbstractPolymorphicSerializer<*>) { + val casted = serializer as AbstractPolymorphicSerializer<Any> + val actualSerializer = casted.findPolymorphicSerializer(this, value as Any) + encodeTaggedString(nested("type"), actualSerializer.descriptor.serialName) + + return actualSerializer.serialize(this, value) + } + + return serializer.serialize(this, value) + } + override fun encodeTaggedValue(tag: String, value: Any) { map[tag] = encode(value) } @@ -89,6 +102,18 @@ public sealed class Properties( return structure(descriptor).also { copyTagsTo(it) } } + final override fun <T> decodeSerializableValue(deserializer: DeserializationStrategy<T>): T { + if (deserializer is AbstractPolymorphicSerializer<*>) { + val type = map[nested("type")]?.toString() + val actualSerializer: DeserializationStrategy<Any> = deserializer.findPolymorphicSerializer(this, type) + + @Suppress("UNCHECKED_CAST") + return actualSerializer.deserialize(this) as T + } + + return deserializer.deserialize(this) + } + final override fun decodeTaggedValue(tag: String): Value { return map.getValue(tag) } @@ -188,7 +213,7 @@ public sealed class Properties( * A [Properties] instance that can be used as default and does not have any [SerializersModule] installed. */ @ExperimentalSerializationApi - public companion object Default : Properties(EmptySerializersModule, null) + public companion object Default : Properties(EmptySerializersModule(), null) } @OptIn(ExperimentalSerializationApi::class) |