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

Kotlin中重命名@Serializable类并保持向后兼容的方法

Kotlin序列化:仅保留NewClass并兼容旧OldClass序列化数据

完全可以只实现NewClass,不需要维护两个重复的类,通过Kotlinx Serialization的序列化名称别名功能就能实现需求:

实现方式

直接在NewClass上通过@SerialName注解同时指定新的主名称和旧的类名称作为别名:

@Serializable
@SerialName(value = "NewClass", alternatives = ["OldClass"])
class NewClass(
    // 保持与原OldClass完全一致的属性结构
    val id: Int,
    val name: String
)

效果说明

  • 序列化时:会使用主名称"NewClass"作为类型标识写入数据,符合你"序列化时用NewClass"的要求。
  • 反序列化时:无论是读取到旧的"OldClass"标识,还是新的"NewClass"标识,都会自动用NewClass类解码,完美兼容新旧两类序列化数据。

配置与使用

只需要在序列化模块中注册NewClass即可,无需再注册旧的OldClass:

// 初始化Json序列化器(按需配置参数)
val jsonFormat = Json {
    ignoreUnknownKeys = true // 可选,避免旧数据存在多余字段时解码报错
    encodeDefaults = true
}

// 序列化示例
val newInstance = NewClass(100, "demo")
val serializedStr = jsonFormat.encodeToString(newInstance)
// 输出的序列化数据中,类型标识为"NewClass"

// 反序列化旧数据示例(原OldClass序列化的内容)
val oldSerializedStr = """{"type":"OldClass","id":100,"name":"demo"}"""
val decodedInstance = jsonFormat.decodeFromString<NewClass>(oldSerializedStr)
// 可正常解码为NewClass实例

注意事项

  • 必须保证NewClass的属性结构与原OldClass完全一致:包括属性名称、类型、是否可为null、默认值等,否则反序列化旧数据时会抛出异常。
  • 如果是在多态序列化场景下(比如作为父类的子类),只需在多态注册中添加NewClass即可,它的别名会被序列化框架自动识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 12:46:04