blob: 680ca998fd7de750bc5364a7abbcba07aa08edc1 [file]
// TARGET_BACKEND: JVM_IR
// WITH_STDLIB
// FILE: serializer.kt
package a
import kotlinx.serialization.*
import kotlinx.serialization.encoding.*
import kotlinx.serialization.descriptors.*
import kotlinx.serialization.json.*
import kotlin.reflect.KClass
import kotlin.test.*
@Serializable(DataSerializer::class)
data class Data(
val i: Int
)
@Serializer(forClass = Data::class)
private object DataSerializer
@Serializable
object SerializableObject
private object CustomSerializer : KSerializer<SerializableObject> {
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("My.SerializableObject", PrimitiveKind.STRING)
override fun serialize(encoder: Encoder, value: SerializableObject) {
encoder.encodeString("custom.serializer")
}
override fun deserialize(decoder: Decoder): SerializableObject {
TODO()
}
}
@Serializable
data class DataWithObject(
// property is object and have custom private serializer
@Serializable(CustomSerializer::class) val obj: SerializableObject
)
class Outer {
private object CustomPrimitiveSerializer : KSerializer<JsonPrimitive> {
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("My.CustomPrimitiveSerializer", PrimitiveKind.STRING)
override fun serialize(encoder: Encoder, value: JsonPrimitive) {
encoder.encodeString("custom.primitive.serializer")
}
override fun deserialize(decoder: Decoder): JsonPrimitive {
TODO()
}
}
fun serialize(): String {
@Serializable
data class Wrapper(
// property in local class with private custom serializer
@Serializable(CustomPrimitiveSerializer::class)
val value: JsonPrimitive,
)
return Json.encodeToString(Wrapper(JsonNull))
}
}
// FILE: holder.kt
package b
import kotlinx.serialization.*
import kotlinx.serialization.encoding.*
import kotlinx.serialization.descriptors.*
import kotlinx.serialization.json.*
import kotlin.reflect.KClass
import kotlin.test.*
import a.Data
import a.DataWithObject
import a.SerializableObject
import a.Outer
@Serializable
data class Holder(
val data: Data
)
fun box(): String {
val json = Json.encodeToString(Holder(Data(1)))
if (json != "{\"data\":{\"i\":1}}") return json
val jsonWithObject = Json.encodeToString(DataWithObject(SerializableObject))
if (jsonWithObject != "{\"obj\":\"custom.serializer\"}") return jsonWithObject
val jsonFromOuter = Outer().serialize()
if (jsonFromOuter != "{\"value\":\"custom.primitive.serializer\"}") return jsonFromOuter
return "OK"
}