Skip to content

Provide an API to build serial descriptors for recursive data-structures.Β #2915

Open
@qwwdfsad

Description

@qwwdfsad

Consider the following class:

data class Node(val data: Int, val nodes: List<Node>)

For that, kotlinx.serialization is able to generate a proper serializer (using the coupling between auto-generated serializer and childSerializers loophole), but there is no public API to write it an external (or custom) serial descriptor/serializer for that.

When solving the similar problem for JsonElement serialization, we ended up with the following:

private fun defer(deferred: () -> SerialDescriptor): SerialDescriptor = object : SerialDescriptor {
private val original: SerialDescriptor by lazy(deferred)
override val serialName: String
get() = original.serialName
override val kind: SerialKind
get() = original.kind
override val elementsCount: Int
get() = original.elementsCount
override fun getElementName(index: Int): String = original.getElementName(index)
override fun getElementIndex(name: String): Int = original.getElementIndex(name)
override fun getElementAnnotations(index: Int): List<Annotation> = original.getElementAnnotations(index)
override fun getElementDescriptor(index: Int): SerialDescriptor = original.getElementDescriptor(index)
override fun isElementOptional(index: Int): Boolean = original.isElementOptional(index)
}

Potentially, we can streamline it, pick a decent name (e.g.: recursive, deferred, nested) and make it public

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions