微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 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 举报,一经查实,本站将立刻删除。