首页 > 解决方案 > kotlinx.serialization 使用自定义序列化程序将 Int 转换为 Boolean

问题描述

我已经花了很多时间尝试编写自定义序列化程序,以在序列化过程中将 Int (TINYINT from mysql) 替换为 Boolean。

使用 Gson 我可以毫无问题地做到这一点,就像这样(java):

    public class BooleanSerializer implements JsonSerializer<Boolean>, JsonDeserializer<Boolean> {

    @Override
    public JsonElement serialize(Boolean arg0, Type arg1, JsonSerializationContext arg2) {
        return new JsonPrimitive(arg0 ? 1 : 0);
    }

    @Override
    public Boolean deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException {
        return arg0.getAsInt() == 1;
    }
}
GsonBuilder().registerTypeAdapter(Boolean.class, serializer)

也许有人已经使用 kotlinx.serialization 库解决了类似的问题?

谢谢你。

标签: androidserializationkotlinkotlinx.serialization

解决方案


很可能这是不可能的:(我发现的唯一解决方案:

  1. 制作自定义“BooleanWraper”
  2. 覆盖序列化方法“保存”和“加载”
  3. 使用“BooleanWraper”而不是 Boolean

    @Serializable
    data class BooleanWraper(val value: Boolean){
    
    @Serializer(forClass = BooleanWraper::class)
    companion object : KSerializer<BooleanWraper> {
        override fun save(output: KOutput, obj: BooleanWraper) =
            output.writeIntValue(if (obj.value) 1 else 0)
    
        override fun load(input: KInput): BooleanWraper=
            BooleanWraper(input.readNullable(IntSerializer) == 1)
    }
    

    }

使用包装器:

@Serializable
data class Example(
    @SerialName("my_bool") val myBool: BooleanWraper
)

推荐阅读