Документация по сериализации Kotlinx
Согласно Kotlinx.serialization
пользовательским аннотациям do c:
"Внутри процесса сериализации / десериализация, ваш собственный класс аннотаций доступен в SerialDescriptor
объект ":
override fun encodeElement(desc: SerialDescriptor, index: Int): Boolean {
val annotations = desc.getElementAnnotations(index)
...
}
Что я хочу сделать
Мне нужно @Transient
эквивалент, но условный:
- classi c way, где:
Json.stringify(serializer, myClass)
работает как обычно. - пользовательский способ, где:
Json.stringify(customSerializer, myClass)
будет возвращать обычные json, но исключая все @MyAnnotation
помеченные значения.
Вот мой код
@SerialInfo
@Target(AnnotationTarget.PROPERTY)
annotation class CustomAnnotation
@Serializable
data class MyClass(val a: String, @CustomAnnotation val b: Int = -1)
И я хотел бы создать собственный сериализатор и добиться чего-то вроде
override fun encodeElement(desc: SerialDescriptor, index: Int): Boolean {
val isTaggedAsCustomAnnotation = desc.getElementAnnotations(index).any{ it is CustomAnnotation }
val myCondition = mySerializer.getMyConditionBlablabla
if(myCondition && isTaggedAsCustomAnnotation) {
encode()
}
...
}
Что я нашел
abstract class ElementValueEncoder : Encoder, CompositeEncoder {
...
open fun encodeElement(desc: SerialDescriptor, index: Int): Boolean = true
}
Но я не знаю, как я могу построить собственный сериализатор так, чтобы Я могу переопределить эту функцию Encoder.encodeElement
. Где я могу получить доступ к ElementValueEncoder в пользовательском сериализаторе?
Я также нашел это пример демо в репозитории kotlinx.serialization github. Он использует TaggedEncoder
& TaggedDecoder
, где я могу переопределить encodeTaggedValue
. Но и здесь я не знаю, как я могу использовать эти кодировщик / декодер в процессе сериализации / десериализации.
Наконец
Где я могу переопределить fun encodeElement(desc: SerialDescriptor, index: Int): Boolean
и как я могу обработать мою собственную аннотацию сериализации?
Спасибо !!