如何为列表创建序列化程序<Pair<String, Any>>

How to create a Serializer for a List<Pair<String, Any>>

我正在尝试为 List<Pair<String, Any>> 类型创建序列化程序,我需要这种类型用于我必须操作键和值但用户可以随时更改键名并使用列表的项目的 Pair 更适合我想要的东西(并且不适用于 Map)。

我有这段代码,但它会生成 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.

的 class

您得到的异常是:

Backend Internal error: Exception during IR lowering

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

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

如果是同一个原因,应该会在1.6.10版本修复。这或许可以解释为什么 .

P.s。您将 运行 遇到的下一个问题可能是 Any 未注册 polymorphic serialization。序列化 Any 是不可靠的。如果您遇到困难并且文档无法帮助您解决问题,我建议您 post 一个新问题,其中包含有关 case/expected 类型的确切用法的更多信息,我很乐意提供帮助。