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

如何使用@Serializable约束类型参数,实现通用对象转JSON序列化函数?

解决Kotlinx Serialization通用序列化扩展函数的问题

你原来的写法试图给类型参数T添加@Serializable注解,但这是错误的用法——@Serializable是用来标记可序列化的类,而非类型参数。以下是两种可行的实现方案:

方案一:最简通用扩展函数

直接利用Kotlinx Serialization的encodeToString重载,结合reified关键字让编译器自动获取类型的序列化器:

import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json

// 全局配置Json实例,可根据需求调整参数(比如是否格式化输出)
private val jsonFormat = Json { prettyPrint = true }

inline fun <reified T> T.serialiseToJson(): String {
    return jsonFormat.encodeToString(this)
}

原理说明

  • reified关键字让编译器在编译期保留T的具体类型信息,encodeToString会自动查找该类型对应的序列化器(前提是T的类上标注了@Serializable)。
  • 如果调用该函数的对象所属类没有标注@Serializable,编译阶段会直接报错,确保类型安全。

方案二:支持自定义序列化器的扩展函数

如果需要支持传入自定义序列化器(比如某些特殊场景下的定制化序列化逻辑),可以显式声明序列化器参数:

import kotlinx.serialization.KSerializer
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import kotlinx.serialization.serializer

private val jsonFormat = Json { prettyPrint = true }

inline fun <reified T> T.serialiseToJson(serializer: KSerializer<T> = serializer()): String {
    return jsonFormat.encodeToString(serializer, this)
}

使用示例

先定义一个可序列化的数据类:

import kotlinx.serialization.Serializable

@Serializable
data class User(val name: String, val age: Int)

调用扩展函数:

val user = User("Alice", 30)
println(user.serialiseToJson())
// 输出格式化后的JSON字符串

如果尝试给未标注@Serializable的类调用该函数,会直接触发编译错误,避免运行时问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:27:24