You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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):

  1. 给父类添加@Polymorphic注解:
    @Serializable
    @Polymorphic
    open class Serializable {
        // ...
    }
    
  2. 修改Json配置:
    val JsonPolymorphic = Json {
        encodeDefaults = true
        usePolymorphicSerialization = true
    }
    
    这种方式会自动识别子类,但序列化后的JSON会多出一个type字段(如"type": "Body"),后端需能兼容该字段。

内容的提问来源于stack exchange,提问作者marios160

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 16:07:02