Kotlin多态序列化异常:子类强转导致type字段缺失
为什么强转操作会导致kotlinx.serialization省略type字段?
这本质是Kotlin智能类型转换和kotlinx.serialization多态序列化机制共同作用的结果:
kotlinx.serialization的多态序列化逻辑
kotlinx.serialization对密封类的多态序列化,只有当你序列化**静态类型为父类(Parent)**的实例时,才会自动添加type字段(用来标识具体子类),并使用父类的多态序列化器处理。如果序列化的对象静态类型是子类(Child),则只会使用子类自身的普通序列化器,不会额外添加type字段——因为此时编译器已经明确知道类型,不需要多态标识。Kotlin智能类型转换的影响
当你执行c as Child这个强转语句时,由于你的c本身就是Child实例(且密封类的特性让编译器可以确定这个强转不会失败),Kotlin编译器会触发智能类型转换:在这条语句之后,变量c的静态类型会被自动提升为Child。这就导致后续的
Json.encodeToString(c)调用中,序列化器会根据c的静态类型(Child)选择普通序列化器,而不是Parent的多态序列化器,自然就不会生成type字段。反序列化时,因为缺失了type标识,多态序列化器无法判断应该实例化哪个子类,就会抛出“Polymorphic serializer was not found”异常。验证与解决
如果要避免这个问题,你可以手动指定序列化的类型为Parent,强制使用多态序列化器:Json.encodeToString(Parent.serializer(), c)或者避免让编译器触发智能类型转换,比如将强转的结果赋值给另一个变量:
val childC = c as Child println("cc: $childC") Json.encodeToString(c) // 此时c的静态类型还是Parent
内容的提问来源于stack exchange,提问作者navid
相关产品推荐
相关产品推荐

