summaryrefslogtreecommitdiff
path: root/formats/properties/commonMain/src/kotlinx/serialization/properties/Properties.kt
diff options
context:
space:
mode:
Diffstat (limited to 'formats/properties/commonMain/src/kotlinx/serialization/properties/Properties.kt')
-rw-r--r--formats/properties/commonMain/src/kotlinx/serialization/properties/Properties.kt27
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)