如何使用@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
相关产品推荐
相关产品推荐

