Him188 / yamlkt

Multiplatform YAML parser & serializer for kotlinx.serialization written in pure Kotlin
Apache License 2.0
131 stars 13 forks source link

Incorrect handling of polymorphism (sealed class) #48

Open amirabiri opened 2 years ago

amirabiri commented 2 years ago

The library appears to be adding a redundant value: to members of a polymorphic collection.

This code:

@Serializable
data class ConfigFile(val items: List<Item>)

@Serializable
sealed class Item

@Serializable
@SerialName("A")
class ItemA(val property: String): Item()

println(Yaml.encodeToString(ConfigFile(listOf(ItemA("foo")))))

Produces the following result:

items:
  - type: A
    value:
      property: foo

This does not appear to be inline with kotlinx.serialization documentation: https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/polymorphism.md#sealed-classes

If using Json the result is as expected:

{
    "items": [
        {
            "type": "A",
            "property": "foo"
        }
    ]
}
Him188 commented 2 years ago

Yamlkt's polymorphism was not being tested, as stated in README that yamlkt does not support polymorohism. The current behavior may be some kind of fallback strategy implemented by kotlunx.serialization for custom formats that does not support polymorphism well. Note that ProtoBuf also uses this format ('type' with proto number 1, 'value' with proto number 2).