【问题标题】:How to use GSON to deserialize <Range<Date>> object如何使用 GSON 反序列化 <Range<Date>> 对象
【发布时间】:2020-09-11 10:43:15
【问题描述】:

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

我可以将 Range> 序列化为一个字符串来存储它。我正在使用简单的方法:

@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 调用无参数构造函数。向 Gson 注册此类型的 InstanceCreator 可能会解决此问题。

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

有什么想法吗?谢谢!

【问题讨论】:

    标签: date gson range android-room typeconverter


    【解决方案1】:

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

    我的新的最终和简单的 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 做:

    Pair(dateRange.minimum, dateRange.maximum)
    

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

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多