Fix attribute serializer

This commit is contained in:
Alexander Nozik 2023-02-11 17:14:00 +03:00
parent 50ccfeab70
commit 2343f37655
2 changed files with 24 additions and 5 deletions

View File

@ -6,9 +6,7 @@ import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.*
public class AttributesSerializer(
private val serializableAttributes: Set<SerializableAttribute<*>>,
@ -21,7 +19,13 @@ public class AttributesSerializer(
val attributeMap: Map<SerializableAttribute<*>, Any> = jsonElement.entries.associate { (key, element) ->
val attr = serializableAttributes.find { it.serialId == key }
?: error("Attribute serializer for key $key not found")
val value = Json.decodeFromJsonElement(attr.serializer, element) ?: error("Null values are not allowed")
val json = if (decoder is JsonDecoder) {
decoder.json
} else {
Json { serializersModule = decoder.serializersModule }
}
val value = json.decodeFromJsonElement(attr.serializer, element) ?: error("Null values are not allowed")
attr to value
}
@ -33,9 +37,16 @@ public class AttributesSerializer(
value.content.forEach { (key, value) ->
if (key !in serializableAttributes) error("An attribute key $key is not in the list of allowed attributes for this serializer")
val serializableKey = key as SerializableAttribute
val json = if (encoder is JsonEncoder) {
encoder.json
} else {
Json { serializersModule = encoder.serializersModule }
}
put(
serializableKey.serialId,
Json.encodeToJsonElement(serializableKey.serializer as KSerializer<Any>, value)
json.encodeToJsonElement(serializableKey.serializer as KSerializer<Any>, value)
)
}
}

View File

@ -7,10 +7,18 @@ import kotlin.test.assertEquals
internal class AttributesSerializationTest {
internal class TestAttributeContainer(val attributes: Attributes)
// internal object TestContainerAttribute: SerializableAttribute<TestAttributeContainer>("container", se)
internal object TestAttribute : SerializableAttribute<Map<String, String>>("test", serializer())
@Test
fun restore() {
//
// val serializersModule = SerializersModule {
// contextual(AttributesSerializer(setOf()))
// }
val serializer = AttributesSerializer(setOf(NameAttribute, TestAttribute))