-
Notifications
You must be signed in to change notification settings - Fork 658
Closed
Description
additions to #1046
package khocon
import com.typesafe.config.ConfigFactory
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.Serializable
import kotlinx.serialization.hocon.Hocon
import kotlinx.serialization.hocon.decodeFromConfig
@Serializable
sealed class Node
@Serializable
data class Root(val name: String): Node()
@Serializable
data class Simple(val a: String)
private val configSimpleClass = """
key1 {
a = "simple"
}
key2 {
a = "simple"
}
"""
private val configSealedClass = """
key1 {
type = "khocon.Root"
name = "seale"
}
key2 {
type = "khocon.Root"
name = "sealed"
}
"""
private val configSealedClassSimple = """
{
type = "khocon.Root"
name = "sealed"
}
"""
@OptIn(ExperimentalSerializationApi::class)
fun main() {
val simpleClassConfig = ConfigFactory.parseString(configSimpleClass)
val sealedClassConfigSimple = ConfigFactory.parseString(configSealedClassSimple)
val sealedClassConfig = ConfigFactory.parseString(configSealedClass)
val hocon = Hocon {
// useArrayPolymorphism = true // error val sealedSimple = hocon.decodeFromConfig<Node>(sealedClassConfigSimple)
}
val simple = hocon.decodeFromConfig<Map<String, Simple>>(simpleClassConfig) // Work
println(simple)
val sealedSimple = hocon.decodeFromConfig<Node>(sealedClassConfigSimple)
println(sealedSimple)
val sealed = hocon.decodeFromConfig<Map<String, Node>>(sealedClassConfig)
println(sealed)
}
output
Exception in thread "main" java.lang.ClassCastException: class com.typesafe.config.impl.SimpleConfigObject cannot be cast to class com.typesafe.config.ConfigList (com.typesafe.config.impl.SimpleConfigObject and com.typesafe.config.ConfigList are in unnamed module of loader 'app')
at kotlinx.serialization.hocon.Hocon$MapConfigReader.beginStructure(Hocon.kt:200)
at kotlinx.serialization.internal.AbstractPolymorphicSerializer.deserialize(AbstractPolymorphicSerializer.kt:130)
at kotlinx.serialization.encoding.Decoder$DefaultImpls.decodeSerializableValue(Decoding.kt:260)
at kotlinx.serialization.internal.TaggedDecoder.decodeSerializableValue(Tagged.kt:177)
at kotlinx.serialization.internal.TaggedDecoder.decodeSerializableValue(Tagged.kt:206)
at kotlinx.serialization.internal.TaggedDecoder$decodeSerializableElement$1.invoke(Tagged.kt:279)
at kotlinx.serialization.internal.TaggedDecoder.tagBlock(Tagged.kt:296)
at kotlinx.serialization.internal.TaggedDecoder.decodeSerializableElement(Tagged.kt:279)
at kotlinx.serialization.encoding.CompositeDecoder$DefaultImpls.decodeSerializableElement$default(Decoding.kt:535)
at kotlinx.serialization.internal.MapLikeSerializer.readElement(CollectionSerializers.kt:111)
at kotlinx.serialization.internal.MapLikeSerializer.readElement(CollectionSerializers.kt:84)
at kotlinx.serialization.internal.AbstractCollectionSerializer.readElement$default(CollectionSerializers.kt:51)
at kotlinx.serialization.internal.AbstractCollectionSerializer.merge(CollectionSerializers.kt:36)
at kotlinx.serialization.internal.AbstractCollectionSerializer.deserialize(CollectionSerializers.kt:43)
at kotlinx.serialization.hocon.Hocon$ConfigReader.decodeSerializableValue(Hocon.kt:126)
at kotlinx.serialization.hocon.Hocon.decodeFromConfig(Hocon.kt:36)
at khocon.MainKt.main(main.kt:69)
at khocon.MainKt.main(main.kt)
Process finished with exit code 1
output: useArrayPolymorphism = true
{key2=Simple(a=simple), key1=Simple(a=simple)}
Exception in thread "main" java.util.NoSuchElementException: List is empty.
at kotlin.collections.CollectionsKt___CollectionsKt.last(_Collections.kt:416)
at kotlinx.serialization.internal.TaggedDecoder.getCurrentTag(Tagged.kt:306)
at kotlinx.serialization.hocon.Hocon$ConfigReader.beginStructure(Hocon.kt:154)
at kotlinx.serialization.internal.AbstractPolymorphicSerializer.deserialize(AbstractPolymorphicSerializer.kt:130)
at kotlinx.serialization.hocon.Hocon$ConfigReader.decodeSerializableValue(Hocon.kt:126)
at kotlinx.serialization.hocon.Hocon.decodeFromConfig(Hocon.kt:36)
at khocon.MainKt.main(main.kt:66)
at khocon.MainKt.main(main.kt)
Environment
- Kotlin version: 1.5.10
- kotlinx-serialization-hocon: 1.2.1
- Kotlin platforms: JVM
- Gradle version: 6.8.1
- IDE version IntellijIDEA 2021.1,