Kotlinx.Serialization用encodeToJsonElement序列化Any类型遇序列化器未找到错误
解决Any类型序列化问题
问题原因
调用json.encodeToJsonElement(data)且data为Any类型时,Kotlin序列化框架无法自动推断实际对象的序列化器。即便在SerializersModule中注册了Any的自定义序列化器,也会因泛型类型擦除和默认查找逻辑限制,抛出找不到Any序列化器的异常。
解决方案
方案1:动态获取实际类型的序列化器
直接根据对象实际类型获取对应序列化器,无需依赖Any的自定义序列化器:
修改f函数如下:
fun f(data: Any) { // 获取对象实际类型的序列化器 val actualSerializer = data::class.serializer() // 传入序列化器完成序列化 val d = json.encodeToJsonElement(actualSerializer, data) println(d) // 输出示例: {"name":"jack"} }
方案2:显式使用自定义序列化器
若需保留DynamicLookupSerializer,调用时需显式指定该序列化器:
fun f(data: Any) { val d = json.encodeToJsonElement(DynamicLookupSerializer, data) println(d) // 输出示例: {"name":"jack"} }
完整可运行代码
以下是方案1的精简代码,无需自定义DynamicLookupSerializer:
import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import kotlinx.serialization.json.encodeToJsonElement import kotlinx.serialization.serializer @Serializable data class Person( val name: String ) private val json = Json {} fun main() { f(Person("jack")) } fun f(data: Any) { val actualSerializer = data::class.serializer() val d = json.encodeToJsonElement(actualSerializer, data) println(d) }
若需支持更多特殊类型,可添加兜底逻辑:
fun f(data: Any) { val actualSerializer = json.serializersModule.getContextual(data::class) ?: data::class.serializer() val d = json.encodeToJsonElement(actualSerializer as KSerializer<Any>, data) println(d) }
关键说明
- Kotlin序列化要求被序列化的类必须标记
@Serializable注解,或提供自定义KSerializer实现。 - 处理
Any类型对象时,必须显式获取其实际类型的序列化器,框架无法自动推断泛型为Any时的具体序列化逻辑。
内容的提问来源于stack exchange,提问作者SageJustus
相关产品推荐
相关产品推荐

