Kotlin可以序列化类引用信息吗



我尝试通过标准kotlinx序列化库序列化KClass引用,但它似乎完全不适用于反射内容。

@Serializable
data class SocketDto(val eventType: KClass<out Event>)

interface Event

@Serializable
data class EnableEvent(val enable: Boolean) : SocketEvent

运行后

println(Json.encodeToString(SocketDto(EnableEvent::class)))

获得

kotlinx.serialization.SerializationException: Class 'ClassReference' is not registered for polymorphic serialization in the scope of 'KClass'

好的,自定义序列化程序似乎在这里工作


@Serializable
data class SocketDto(
@Serializable(with = ClassRefSerializer::class) val eventType: KClass<out Event>
)
object ClassRefSerializer : KSerializer<KClass<out Any>> {
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("classRef", PrimitiveKind.STRING)
override fun deserialize(decoder: Decoder) = Class.forName(decoder.decodeString()).kotlin
override fun serialize(encoder: Encoder, value: KClass<out Any>) = encoder.encodeString(value.jvmName)
}
{"eventType":"test.EnableEvent"}
SocketDto(eventType=class test.EnableEvent)

为什么不默认这种行为?

最新更新