我想用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
,则不会包含此类鉴别器,这是有问题的;反序列化的人怎么知道它是什么类型的?
简而言之,我认为您需要多态序列化。