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

如何为标注@Serializable的Kotlin枚举类编写serializeAsArray通用扩展函数?

问题描述

给定如下Kotlin枚举类:

@kotlinx.serialization.Serializable
enum class MyEnum {
    @SerialName("One") ONE,
    @SerialName("Two") TWO,
    @SerialName("Three") THREE
}

Kotlin序列化会自动生成MyEnum.serializer()函数,用于获取该枚举的序列化器。

当需要处理数组类型的序列化时,我们可以用ArraySerializer包装枚举的序列化器:

ArraySerializer(MyEnum.serializer())

之前已经封装过一个扩展函数简化调用:

inline fun <reified T : Any> KSerializer<T>.asArray(): KSerializer<Array<T>> {
    return ArraySerializer(this)
}

使用时写法如下:

MyEnum.serializer().asArray()

现在想要实现更简洁的调用方式,直接通过枚举类调用MyEnum.serializeAsArray()来获取数组序列化器,该如何编写通用扩展函数?

解决方案

可以给类的伴生对象编写一个reified内联扩展函数,直接在类对象上生成数组序列化器:

import kotlinx.serialization.KSerializer
import kotlinx.serialization.builtins.ArraySerializer
import kotlinx.serialization.serializer

inline fun <reified T : Any> T.Companion.serializeAsArray(): KSerializer<Array<T>> {
    return ArraySerializer(serializer())
}

这样就能直接通过枚举类(或任何标记了@Serializable的类)调用:

MyEnum.serializeAsArray()

补充说明

  • 借助reified类型参数,函数内部可以直接获取T的序列化器
  • 扩展函数挂载到类的伴生对象上,调用逻辑和serializer()保持一致,更符合使用直觉
  • 这个扩展是通用的,适用于所有标记了@Serializable的类,不局限于枚举

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:55:15