kotlinx.serialization使用自定义序列化程序将Int转换为Boolean

时间:2018-07-06 19:31:48

标签: android serialization kotlin kotlinx.serialisation

我已经花了很多时间尝试编写自定义序列化程序,以在序列化过程中将Int(mysql中的TINYINT)替换为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库解决了类似的问题?

谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

    @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
)