在 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
    }

}

}
nothingspeaker 回答:在 kotlin 序列化中为多态递归类创建自定义序列化程序

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/16555.html

大家都在问