【问题标题】:Does Kotlin can serialize class reference information?Kotlin 可以序列化类引用信息吗?
【发布时间】:2021-05-24 12:05:36
【问题描述】:

我尝试通过标准的 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'

【问题讨论】:

  • 为什么首先需要序列化KClass?连载是一件很奇怪的事情。
  • @Sweeper 我需要在 SocketDto 中获取事件类型。任何。这个问题要广泛得多
  • KClass 是一个接口,ClassReference 是内部 stdlib API 的一部分,所以这个问题与stackoverflow.com/questions/66355506/… 非常相似

标签: json kotlin serialization


【解决方案1】:

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


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

为什么默认情况下没有这种行为?

【讨论】:

    猜你喜欢
    • 2010-12-25
    • 2016-07-16
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 2013-02-22
    • 1970-01-01
    相关资源
    最近更新 更多