在 kotlin 序列化中为多态递归类创建自定义序列化程序

问题描述

我想为一个名为 MapNode 的类编写一个自定义序列化程序,该类包含两个自身列表和一些其他属性

abstract class MapNode {
   var colorIndex : Int = 0

   var left = listof<MapNode>()
   var right = listof<MapNode>()
}

TextNode 是继承 MapNode 的

class TextNode : MapNode{
    var text : String = ""
}

这些属性都是委托的,这就是为什么我需要为它们编写自定义序列化程序作为解决方法,因为委托的属性没有被认序列化

我是否应该为 TextNode 编写一个序列化程序并在这个序列化程序中序列化和反序列化 MapNode 的所有属性,但如果我这样做,那么每次我编写一个扩展 MapNode 的类时,我都必须再次序列化和反序列化 MapNode 属性

>

我不知道如何在序列化器内部获取MapNode序列化器并序列化自身的列表

我想出了这段代码,但它不完整,也没有解决问题,我希望得到一些见解

object MapNodeSerializer : KSerializer<MapNode> {

private val serializer = ListSerializer(this)

@OptIn(
    ExperimentalSerializationApi::class,kotlinx.serialization.InternalSerializationApi::class
)
override val descriptor: SerialDescriptor = buildClassSerialDescriptor("MapNode") {
    element<Boolean>("is_group")
    element<Int>("color_index")
    element<List<MapNode>>("left")
    element<List<MapNode>>("right")
}

override fun deserialize(decoder: Decoder): MapNode {
    val node = TextNode() //how to get the subclass here
    decoder.decodeBoolean()
    decoder.decodeInt()
    
    //how to decode the left list and right list
    return node
}

override fun serialize(encoder: Encoder,value: MapNode) {
    encoder.encodeStructure(descriptor = descriptor) {
        encodeBooleanElement(descriptor = descriptor,value.isGroup)
        encodeIntElement(descriptor = descriptor,1,value.colorIndex)

        //How to encode the left list & right list
    }

}

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)