Skip to content

Commit

Permalink
Support polymorphic serialization
Browse files Browse the repository at this point in the history
  • Loading branch information
Him188 committed Feb 3, 2021
1 parent 70c2ae7 commit 2a2d82b
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package net.mamoe.yamlkt.internal

import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.SerializationException
import kotlinx.serialization.descriptors.PolymorphicKind
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.descriptors.SerialKind
import kotlinx.serialization.descriptors.StructureKind
Expand Down Expand Up @@ -747,6 +748,7 @@ internal class YamlDecoder(
else -> throw contextualDecodingException("expected list(sequence), but found $token")
}
}
is PolymorphicKind,
StructureKind.CLASS -> {
return when (val token = nextToken()) {
END_OF_FILE -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ package net.mamoe.yamlkt.internal
import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerializationStrategy
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.descriptors.PolymorphicKind
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.descriptors.StructureKind
import kotlinx.serialization.encoding.CompositeEncoder
Expand Down Expand Up @@ -55,7 +56,7 @@ internal class YamlEncoder(
private fun beginStructureImpl(parent: AbstractEncoder?, descriptor: SerialDescriptor): CompositeEncoder {
writer.levelIncrease()
return when (descriptor.kind) {
StructureKind.CLASS
StructureKind.CLASS, is PolymorphicKind
-> {
when (configuration.classSerialization) {
YamlBuilder.MapSerialization.BLOCK_MAP -> {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package net.mamoe.yamlkt.decoder

import kotlinx.serialization.Contextual
import kotlinx.serialization.Serializable
import kotlinx.serialization.modules.SerializersModule
import net.mamoe.yamlkt.Yaml
import org.junit.Test
import kotlin.test.assertEquals


internal class ContextualTest {
interface Fruit

@Serializable
data class Banana(
val prop: String
) : Fruit

@Serializable
data class Poly(
val fruit: @Contextual Fruit
)

val yaml = Yaml {
serializersModule = SerializersModule {
contextual(Banana::class, Banana.serializer())
}
}

@Test
fun `test simple dump`() {
val poly = Poly(Banana("prop"))
val result = yaml.encodeToString(poly)
assertEquals(
"""
fruit:
prop: prop
""".trimIndent(), result
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package net.mamoe.yamlkt.decoder

import kotlinx.serialization.Serializable
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.polymorphic
import net.mamoe.yamlkt.Yaml
import org.junit.Test
import kotlin.test.assertEquals


internal class PolymorphismTest {
interface Fruit

@Serializable
data class Banana(
val prop: String
) : Fruit

@Serializable
data class Poly(
val fruit: Fruit
)

val yaml = Yaml {
serializersModule = SerializersModule {
polymorphic(Fruit::class) {
subclass(Banana::class, Banana.serializer())
}
}
}

@Test
fun `test simple dump`() {
val poly = Poly(Banana("prop"))
val result = yaml.encodeToString(poly)
println(result)
val decode = yaml.decodeFromString(Poly.serializer(), result)
assertEquals(poly, decode)
}
}

0 comments on commit 2a2d82b

Please sign in to comment.