【问题标题】:kotlinx.serialization convert Int to Boolean with custom serializerkotlinx.serialization 使用自定义序列化程序将 Int 转换为 Boolean
【发布时间】:2018-07-06 19:31:48
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: android serialization kotlin kotlinx.serialization


    【解决方案1】:

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

    1. 制作自定义“BooleanWraper”
    2. 覆盖序列化方法“save”和“load”
    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
    )
    

    【讨论】:

      猜你喜欢
      • 2019-07-20
      • 1970-01-01
      • 2017-12-31
      • 2016-03-20
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      相关资源
      最近更新 更多