如何使用 Kotlinx 序列化对类型化的 class 进行编码?

How can I encode a typed class with Kotlinx Serialization?

我想使用 Kotlinx 序列化 encodeToString.

T: EventData 类型的给定 class 进行编码

这是我的代码:

class EventDispatcher<T: EventData>(
    val pubSubTemplate: PubSubTemplate
) {
    /**
     * Dispatch an event to the game engine event manager pipeline
     */
    fun dispatchEvent(event: T, initiator: String) {
        val eventData: String = Json.encodeToString(event)
    }

编译器告诉我:

Cannot use `T` as reified type parameter. Use a class instead

有没有办法让它仍然有效?

要使 Json.encodeToString(event) 正常工作,它需要 T 的类型信息。但是,由于泛型在 Kotlin/Java.

中的工作方式,此类型信息在运行时会丢失

保留类型信息的一种方法是 making dispatchEvent an inline function with T as a reified type parameter

然而,这也提出了一个问题,你想如何序列化event。您也可以使用 polymorphic serialization of EventData,而不是尝试序列化 T。这将在您的序列化输出中包含一个额外的 class 鉴别器(多态性 serialization/deserialization 必须如此)。

如果序列化 concrete 类型 T,则不会包含此 class 鉴别器,这是有问题的;反序列化它的人怎么知道它是什么类型?

简而言之,我认为你需要多态序列化。