如何为标注@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
相关产品推荐
相关产品推荐

