android - 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 库解决了类似的问题?
谢谢你。
解决方案
很可能这是不可能的:(我发现的唯一解决方案:
- 制作自定义“BooleanWraper”
- 覆盖序列化方法“保存”和“加载”
使用“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
)
推荐阅读
- php - Laravel 和 Vue - handler.call 不是函数
- flutter - 使用多个 SliverStaggeredGrid 时颤动 CustomScrollView 滚动错误
- c# - 如何实现类的字符串名称与类本身的一致性?
- python-3.x - 如何在机器人框架中按下上下文菜单的向下箭头键
- javascript - 为jQuery中动态创建的按钮提供不同的ID
- javascript - RxJS:Forkjoin 类实例属性
- python - 无法正确加密python3中的数据
- python - 无法从 PIL 导入 PILLOW_VERSION
- python - 如何使用 Python Selenium 单击具有 href 属性的元素
- java - 找到超过 1 行具有给定标识符的行