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



我想用Kotlinx序列化encodeToString对给定的T: EventData类型的类进行编码。

这是我的代码:

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中的工作方式,这种类型信息在运行时会丢失。

保留类型信息的一种方法是使dispatchEvent成为内联函数,T作为具体化的类型参数。

然而,这也提出了如何序列化event的问题。您也可以使用EventData的多态序列化,而不是尝试序列化T。这将在序列化输出中包括一个额外的类鉴别器(多态序列化/反序列化必须使用它(。

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

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

最新更新