Kotlin子类继承Serializable父类,JSON序列化仅取父类属性的解决方法
解决子类属性无法被父类序列化方法读取的问题
核心原因
问题出在Kotlinx Serialization的编译时类型确定机制:父类方法中Json.encodeToString(this)的this静态类型是Serializable,序列化器只会处理父类属性,完全忽略子类字段。加上你需要用父类作为通用参数传入函数,必须配置多态序列化才能让序列化器识别实际的子类类型。
具体修复步骤
1. 给所有子类添加@Serializable注解
每个继承自Serializable的子类都需要标记@Serializable,否则序列化器无法识别它们的字段:
@Serializable class Body( var variable1: String, var variable2: String, var variable3: Int, ): Serializable() @Serializable class Body2( var variableA: String, var variableB: String, var variableC: Int, ): Serializable()
2. 配置支持多态序列化的Json实例
创建全局的Json实例,注册所有子类的序列化器,替代默认的Json对象:
val JsonPolymorphic = Json { encodeDefaults = true // 可选:序列化字段的默认值 serializersModule = SerializersModule { polymorphic(Serializable::class) { subclass(Body::class) subclass(Body2::class) // 后续新增子类需在此注册 } } }
3. 修改父类的getJson()方法
使用配置好的JsonPolymorphic实例进行序列化:
@Serializable open class Serializable { fun getJson(): String { return JsonPolymorphic.encodeToString(this) } }
4. 同步修改Request函数的序列化逻辑
确保请求体序列化也使用同一个JsonPolymorphic实例:
suspend inline fun <reified T> Request(route: String, body: Serializable, method: HttpMethod): BaseResponse<T> { val response: HttpResponse = client.request(Address + route) { this.method = method contentType(ContentType.Application.Json) setBody(JsonPolymorphic.encodeToString(body)) } return Json{ ignoreUnknownKeys = true }.decodeFromString(response.bodyAsText()) }
简化方案(自动多态序列化)
如果不想手动注册每个子类,可启用自动多态序列化(需使用最新版kotlinx-serialization-json):
- 给父类添加
@Polymorphic注解:@Serializable @Polymorphic open class Serializable { // ... } - 修改
Json配置:
这种方式会自动识别子类,但序列化后的JSON会多出一个val JsonPolymorphic = Json { encodeDefaults = true usePolymorphicSerialization = true }type字段(如"type": "Body"),后端需能兼容该字段。
内容的提问来源于stack exchange,提问作者marios160
相关产品推荐
相关产品推荐

