Я пытался использовать один из пакета сериализации Kotlin со следующим настраиваемым примером класса. Я расширю этот класс в соответствии с реальным вариантом использования, добавив List
реального класса (который также необходимо сериализовать), но сейчас проблема просто заключается в десериализации. Мне удалось заставить сериализацию работать (во втором фрагменте кода есть как объект, который нужно сериализовать, так и результирующий String
), и кажется, что процесс десериализации требует того же способом (т. е. с использованием экземпляра NullableSerializer
) (на самом деле, я не нашел прямо сейчас простого и правильного способа десериализации закодированного объекта. Вот класс, простой, но сложный для подражания.
@Serializable(with = EhEH.Companion::class)
data class EhEH(
val i: Int
, val txt: String
//, val list: Array<String> // next feature, also with complex data, not only "simple" Strings
) {
@Serializer(forClass = EhEH::class)
companion object : KSerializer<EhEH> {
public var deserialEhEH: DeserializationStrategy<EhEH> = EhEH
override val descriptor: SerialDescriptor =
SerialDescriptor("EhEHSerializer", PrimitiveKind.STRING)
override fun serialize(encoder: Encoder, obj: EhEH) =
encoder.encodeString(obj::class.qualifiedName!!)
override fun deserialize(decoder: Decoder): EhEH {
val dec = decoder.beginStructure(descriptor)
var txt: String? = null
var x: Int? = null
var i = -1
var notFinished = true
do {
i = dec.decodeElementIndex(descriptor)
when (i) {
CompositeDecoder.READ_DONE -> notFinished = false
0 -> x = dec.decodeStringElement(descriptor, i).toIntOrNull()
1 -> txt = dec.decodeStringElement(descriptor, i)
else -> throw SerializationException("Unknown index $i")
}
} while (notFinished)
dec.endStructure(descriptor)
return EhEH(
x ?: throw MissingFieldException("x"),
txt ?: throw MissingFieldException("txt")
)
}
}
override fun toString(): String {
return "EhEH(i=$i, s='$txt')"
}
}
Функция ручного тестирования (значение которой просто печатается):
@InternalSerializationApi
fun testCborString(): String {
var e: EhEH = EhEH(
7,
"poreccio"
//, listOf("just", "another", "vacuum", "test")
)
return Cbor.dumps(
NullableSerializer(
EhEH.Companion
), e
) + " <-> " + (
{
(Cbor.load(
NullableSerializer(
EhEH.Companion
),
Cbor.dump(
NullableSerializer(EhEH.Companion), e
)
//the dumped value should be "781d62632e7472797669756d2e6170692e726573706f6e7365732e45684548"
)
as EhEH).toString()
} as () -> String)()
}
Когда я пытаюсь запустить его, исключение составляет вызов Cbor.load
:
kotlinx.serialization.cbor.CborDecodingException: Expected start of map, but found 78
Я единственный во ВСЕМ Интернете, у кого есть эта проблема?