diff --git a/dataforge-io/src/commonMain/kotlin/hep/dataforge/io/serialization/MetaSerializer.kt b/dataforge-io/src/commonMain/kotlin/hep/dataforge/io/serialization/MetaSerializer.kt index 271f95e2..b22fed4a 100644 --- a/dataforge-io/src/commonMain/kotlin/hep/dataforge/io/serialization/MetaSerializer.kt +++ b/dataforge-io/src/commonMain/kotlin/hep/dataforge/io/serialization/MetaSerializer.kt @@ -1,6 +1,7 @@ -package hep.dataforge.io +package hep.dataforge.io.serialization -import hep.dataforge.io.serialization.descriptor +import hep.dataforge.io.toJson +import hep.dataforge.io.toMeta import hep.dataforge.meta.* import hep.dataforge.names.NameToken import hep.dataforge.values.* @@ -16,10 +17,10 @@ object ValueSerializer : KSerializer { private val valueTypeSerializer = EnumSerializer(ValueType::class) private val listSerializer by lazy { ArrayListSerializer(ValueSerializer) } - override val descriptor: SerialDescriptor = descriptor("Value") { + override val descriptor: SerialDescriptor = descriptor("hep.dataforge.values.Value") { boolean("isList") enum("valueType") - element("value", PolymorphicClassDescriptor) + element("value", null) } private fun Decoder.decodeValue(): Value { @@ -69,7 +70,7 @@ object ValueSerializer : KSerializer { object MetaItemSerializer : KSerializer> { override val descriptor: SerialDescriptor = descriptor("MetaItem") { boolean("isNode") - element("value", PolymorphicClassDescriptor) + element("value", null) } @@ -93,17 +94,21 @@ object MetaItemSerializer : KSerializer> { private class DeserializedMeta(override val items: Map>) : MetaBase() - /** * Serialized for meta */ @Serializer(Meta::class) object MetaSerializer : KSerializer { - private val mapSerializer = - HashMapSerializer(StringSerializer, MetaItemSerializer) + private val mapSerializer = HashMapSerializer( + StringSerializer, + MetaItemSerializer + ) - override val descriptor: SerialDescriptor = - NamedMapClassDescriptor("Meta", StringSerializer.descriptor, MetaItemSerializer.descriptor) + override val descriptor: SerialDescriptor = NamedMapClassDescriptor( + "hep.dataforge.meta.Meta", + StringSerializer.descriptor, + MetaItemSerializer.descriptor + ) override fun deserialize(decoder: Decoder): Meta { return if (decoder is JsonInput) { diff --git a/dataforge-io/src/commonMain/kotlin/hep/dataforge/io/serialization/serializationUtils.kt b/dataforge-io/src/commonMain/kotlin/hep/dataforge/io/serialization/serializationUtils.kt index 4d33fad9..09d17054 100644 --- a/dataforge-io/src/commonMain/kotlin/hep/dataforge/io/serialization/serializationUtils.kt +++ b/dataforge-io/src/commonMain/kotlin/hep/dataforge/io/serialization/serializationUtils.kt @@ -12,12 +12,12 @@ import kotlinx.serialization.internal.* inline class SerialDescriptorBuilder(private val impl: SerialClassDescImpl) { fun element( name: String, - descriptor: SerialDescriptor, + descriptor: SerialDescriptor?, isOptional: Boolean = false, vararg annotations: Annotation ) { impl.addElement(name, isOptional) - impl.pushDescriptor(descriptor) + descriptor?.let { impl.pushDescriptor(descriptor) } annotations.forEach { impl.pushAnnotation(it) } @@ -57,7 +57,7 @@ inline class SerialDescriptorBuilder(private val impl: SerialClassDescImpl) { fun doubleArray(name: String, isOptional: Boolean = false, vararg annotations: Annotation) = element(name, DoubleArraySerializer.descriptor, isOptional, *annotations) - inline fun > enum(name: String, isOptional: Boolean = false, vararg annotations: Annotation) = + inline fun > enum(name: String, isOptional: Boolean = false, vararg annotations: Annotation) = element(name, EnumSerializer(E::class).descriptor, isOptional, *annotations) fun classAnnotation(a: Annotation) = impl.pushClassAnnotation(a) @@ -65,7 +65,10 @@ inline class SerialDescriptorBuilder(private val impl: SerialClassDescImpl) { fun build(): SerialDescriptor = impl } -inline fun KSerializer<*>.descriptor(name: String, block: SerialDescriptorBuilder.() -> Unit): SerialDescriptor = +inline fun KSerializer.descriptor( + name: String, + block: SerialDescriptorBuilder.() -> Unit +): SerialDescriptor = SerialDescriptorBuilder(SerialClassDescImpl(name)).apply(block).build() fun Decoder.decodeStructure( diff --git a/dataforge-io/src/commonTest/kotlin/hep/dataforge/io/MetaSerializerTest.kt b/dataforge-io/src/commonTest/kotlin/hep/dataforge/io/MetaSerializerTest.kt index f33ad894..7a8447c0 100644 --- a/dataforge-io/src/commonTest/kotlin/hep/dataforge/io/MetaSerializerTest.kt +++ b/dataforge-io/src/commonTest/kotlin/hep/dataforge/io/MetaSerializerTest.kt @@ -1,5 +1,7 @@ package hep.dataforge.io +import hep.dataforge.io.serialization.MetaItemSerializer +import hep.dataforge.io.serialization.MetaSerializer import hep.dataforge.io.serialization.NameSerializer import hep.dataforge.meta.buildMeta import hep.dataforge.names.toName