首页 > 解决方案 > 如何使用 GSON 反序列化> 对象

问题描述

我的问题很简单。我必须实现一些 TypeConverters 来管理 Android 中 Room 数据库的数据。

我可以将 Range< Date>> 序列化为字符串以进行存储。我正在使用简单的方法:

@TypeConverter
fun rangeToString(range: Range <Date>?): String {
    val gson = Gson()
    return gson.toJson(range)
}

但是当我尝试通过相反的过程取回相同的信息时:

@TypeConverter
fun stringToRange(value: String): Range <Date>? {
    val mapType = object: TypeToken<Range <Date>?>() {}.type
    return Gson().fromJson (value, mapType)
}

我收到一个错误:无法为 java.util.Comparator <java.util.Date> 调用无参数构造函数。向 Gson 注册此类型的 InstanceCreator 可能会解决此问题。

我知道问题是 GSON 不知道如何用日期实例化范围。我认为也许如果我使用自定义 registerTypeAdapter 或类似的东西可以解决问题,但我没有找到方法。

任何想法?谢谢!

标签: dategsonrangeandroid-roomtypeconverter

解决方案


让我们更容易。我无法弄清楚如何反序列化 Range<Date>,但我已经解决了它更改 Pair<Date, Date> 的对象。

我的新的最终和简单的 TypeConverters:

@TypeConverter
fun stringToRange(value: String): Pair<Date, Date>? {
    val mapType = object : TypeToken<Pair<Date, Date>?>() {}.type
    return Gson().fromJson(value, mapType)
}

@TypeConverter
fun rangeToString(range: Pair<Date, Date>?): String {
    val gson = Gson()
    return gson.toJson(range)
}

你可以很容易地改变你的 Range< Date> 做:

Pair(dateRange.minimum, dateRange.maximum)

使用此解决方案,我没有回答我的问题,但这是解决问题的另一种方法。


推荐阅读