如何为List<Role>字段复用RoleSerializer,避免新增序列化器?
解决Kotlin Serialization复用枚举序列化器处理List集合的问题
你不需要额外编写List
方案一:直接给Role枚举绑定序列化器(推荐)
把序列化器绑定到Role枚举本身,而非在List
// 为Role枚举指定序列化器 @Serializable(with = RoleSerializer::class) enum class Role { // 替换为你的实际枚举值 ADMIN, REGULAR_USER, GUEST } // 数据类无需在role字段添加额外序列化注解 @Serializable data class NetworkUser( @SerialName("id") val id: Long, // 其他字段... @SerialName("role") val role: List<Role> )
修改后,序列化/反序列化List
方案二:全局注册序列化器
如果不想修改Role枚举的代码,可以通过全局注册的方式让框架识别Role的序列化规则,效果和Gson全局注册TypeAdapter一致:
// 创建序列化模块,注册Role与对应的序列化器 val customSerializersModule = SerializersModule { contextual(Role::class, RoleSerializer) } // 配置Json实例,加载自定义模块 val jsonConfig = Json { serializersModule = customSerializersModule // 根据需求添加其他配置,比如忽略未知字段 ignoreUnknownKeys = true } // 为Retrofit配置该Json转换器 val retrofit = Retrofit.Builder() .baseUrl("你的接口基础地址") .addConverterFactory(KotlinxSerializationConverterFactory.create(jsonConfig)) .build()
全局注册后,所有用到Role的地方(包括集合类型)都会自动使用RoleSerializer,无需在字段上添加任何注解。
为什么原写法报错?
你之前在List@Serializable(RoleSerializer::class),相当于要求框架用仅能处理单个Role的序列化器去处理整个List对象,类型不匹配自然会报错。正确的思路是告诉框架单个元素的序列化规则,框架会自动处理集合的遍历与元素序列化。
内容的提问来源于stack exchange,提问作者user924
相关产品推荐
相关产品推荐

