yamlkt icon indicating copy to clipboard operation
yamlkt copied to clipboard

Incorrect handling of polymorphism (sealed class)

Open amirabiri opened this issue 3 years ago • 1 comments

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"
        }
    ]
}

amirabiri avatar Sep 07 '22 19:09 amirabiri

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).

Him188 avatar Sep 08 '22 01:09 Him188