【问题标题】:How to create a Serializer for a List<Pair<String, Any>>如何为 List<Pair<String, Any>> 创建序列化程序
【发布时间】:2021-12-28 22:59:34
【问题描述】:

我正在尝试为List&lt;Pair&lt;String, Any&gt;&gt; 类型创建一个序列化程序,我需要这种类型用于我必须操作键和值但用户可以随时更改键名并且使用对列表的项目很多更好地满足我的需求(并且不适用于地图)。

我有这段代码,但它会生成一个compiler error

class SnapshotListPairSerializer<K, V>(private val keySerializer: KSerializer<K>, private val valueSerializer: KSerializer<V>) :
    KSerializer<SnapshotStateList<Pair<K, V>>> {
    override val descriptor: SerialDescriptor = ListSerializer(PairSerializer(keySerializer, valueSerializer)).descriptor
    
    override fun serialize(encoder: Encoder, value: SnapshotStateList<Pair<K, V>>) {
        encoder.encodeSerializableValue(ListSerializer(PairSerializer(keySerializer, valueSerializer)), value as List<Pair<K, V>>)
    }
    
    override fun deserialize(decoder: Decoder): SnapshotStateList<Pair<K, V>> {
        val list = mutableStateListOf<Pair<K, V>>()
        val items = decoder.decodeSerializableValue(ListSerializer(PairSerializer(keySerializer, valueSerializer)))
        list.addAll(items)
        return list
    }
}

另外,SnapshotStateList 是一个来自Jetpack Compose 并扩展List 的类。

【问题讨论】:

  • (PasteBin 链接提供Error, this is a private paste or is pending moderation. — 这当然是为什么在可能的情况下直接在问题中包含类似内容的原因之一。)
  • 你的代码对我来说编译得很好。请不要在 SO 问题上使用指向您的代码/错误的链接,而是使用格式化的代码/堆栈跟踪的重要部分。
  • 抱歉链接在几天前还在工作,我会更改它,但我的堆栈跟踪就像 3000 行一样长,有很多编译器代码和编译器说“那里那里那里我不是工作”。
  • 这个错误现在在 pastebin 上是公开的。
  • 感谢您提供完整的堆栈跟踪。但是,您能否在问题中包含您遇到的异常的 main 点,即异常,正如现在两次建议的那样? “后端内部错误:IR 降低期间的异常”它不仅可以防止此类问题,而且对那些试图帮助您的人更友好,并且确保您的问题的本质可以更轻松地在 Google 结果中结束回报帮助他人。 ;)

标签: kotlin serialization android-jetpack-compose key-value kotlinx.serialization


【解决方案1】:

你得到的例外是:

后端内部错误:IR 降低期间出现异常

鉴于这不是为您提供有意义的信息,而是提及编译器内部,这不是您的错误,而是一个错误:搜索已知错误的提示。

这似乎与issue I filed on GitHub 非常相似。

如果是同样的原因,应该在1.6.10版本中修复。这或许可以解释为什么Philip can't repro

附:您将遇到的下一个问题很可能是Any 未注册polymorphic serialization。序列化Any 是不可靠的。如果您遇到困难并且文档无法帮助您,我建议您发布一个新问题,其中包含有关确切用例/预期类型的​​更多信息,我很乐意提供帮助。

【讨论】:

  • 好的,我不知道,谢谢!但就我而言,我只是使用了一个基本的 List 序列化程序而不是一个用于 List 对的序列化程序,而且它工作得很好^^
猜你喜欢
  • 2019-04-12
  • 2017-01-15
  • 2014-07-18
  • 2017-05-21
  • 2014-02-08
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多