Prioritize @Serializable annotation on type usage over class usage
In `val p: @Serializable(X) Foo` and `@Serializable(Y) class Foo` situation, now X would be chosen as serializer. Fixes https://github.com/Kotlin/kotlinx.serialization/issues/1895
This commit is contained in:
committed by
Space Team
parent
d2d13c8765
commit
242b83edbd
@@ -0,0 +1,56 @@
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
|
||||
// WITH_STDLIB
|
||||
|
||||
import kotlinx.serialization.*
|
||||
import kotlinx.serialization.json.*
|
||||
import kotlinx.serialization.descriptors.*
|
||||
import kotlinx.serialization.encoding.*
|
||||
import kotlinx.serialization.internal.*
|
||||
|
||||
|
||||
@Serializable(BruhSerializerA::class)
|
||||
class Bruh(val s: String)
|
||||
|
||||
object BruhSerializerA : KSerializer<Bruh> {
|
||||
override val descriptor: SerialDescriptor
|
||||
get() = PrimitiveSerialDescriptor("Bruh", PrimitiveKind.STRING)
|
||||
|
||||
override fun serialize(encoder: Encoder, value: Bruh) {
|
||||
encoder.encodeString(value.s)
|
||||
}
|
||||
|
||||
override fun deserialize(decoder: Decoder): Bruh {
|
||||
return Bruh(decoder.decodeString())
|
||||
}
|
||||
}
|
||||
|
||||
object BruhSerializerB : KSerializer<Bruh> {
|
||||
override val descriptor: SerialDescriptor
|
||||
get() = PrimitiveSerialDescriptor("Bruh", PrimitiveKind.STRING)
|
||||
|
||||
override fun serialize(encoder: Encoder, value: Bruh) {
|
||||
encoder.encodeString(value.s + "#")
|
||||
}
|
||||
|
||||
override fun deserialize(decoder: Decoder): Bruh {
|
||||
return Bruh(decoder.decodeString().removeSuffix("#"))
|
||||
}
|
||||
}
|
||||
|
||||
typealias BruhAlias = @Serializable(BruhSerializerB::class) Bruh
|
||||
|
||||
@Serializable
|
||||
class Tester(
|
||||
val b1: Bruh,
|
||||
@Serializable(BruhSerializerB::class) val b2: Bruh,
|
||||
val b3: @Serializable(BruhSerializerB::class) Bruh,
|
||||
val b4: BruhAlias
|
||||
)
|
||||
|
||||
fun box(): String {
|
||||
val t = Tester(Bruh("a"), Bruh("b"), Bruh("c"), Bruh("d"))
|
||||
val s = Json.encodeToString(t)
|
||||
if (s != """{"b1":"a","b2":"b#","b3":"c#","b4":"d#"}""") return s
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user