kotlinx.serialization.cbor.CborDecodingException:应为映射的开始,但找到78

kotlinx.serialization.cbor.CborDecodingException:应为映射的开始,但找到78,kotlin,serialization,decoding,cbor,kotlinx,Kotlin,Serialization,Decoding,Cbor,Kotlinx,我试图将Kotlin的一个用于以下自定义示例类。我将通过添加真实类(也需要序列化)的列表来扩展这个与真实用例匹配的类,但是现在的问题仅仅在于反序列化。 我已经设法使序列化工作(在第二段代码中,有要序列化的对象和生成的String)并且似乎反序列化过程需要以相同的方式完成(即,通过使用NullableSerializer的实例)(事实上,我现在还没有找到一种简单而正确的方法来反序列化编码对象。 这是一个简单但复杂的类 @Serializable(with = EhEH.Companion::cla

我试图将Kotlin的一个用于以下自定义示例类。我将通过添加真实类(也需要序列化)的
列表来扩展这个与真实用例匹配的类,但是现在的问题仅仅在于反序列化。
我已经设法使序列化工作(在第二段代码中,有要序列化的对象和生成的
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')"
    }
}

我是整个互联网上唯一一个有这个问题的人吗?

我自己找到了一个方法,基本上有两个错误:

  • override val descriptor:SerialDescriptor
    变量设置为识别
    String
    ,但这显然不是所需的变量,因为它是一个类:

    // val stringArraySerializer= ArraySerializer(String.serializer())
    SerialDescriptor("EhEHSerializer", StructureKind.CLASS) {
            element<Int>("i")
            element<String>("txt")
            // element<Array<String>>("list") // kept here for future references for Array of primitive stuffs
            // element("arrComplexClass", AComplexClassTaggedSerializable.descriptor) // in case of Array of complex objects, a tag @Serializable and a companion object implementing Kserializable<AComplexClassTaggedSerializable> is needed
        }
    
    此外,其他基本注意事项:

  • 在需要将复杂对象包装到
    NullableSerializer
    上的情况下,对于
    数组
    ,也需要:

    val serializerArray_AComplexClassTaggedSerializable =
        ArraySerializer<AComplexClassTaggedSerializable, AComplexClassTaggedSerializable?>(
            NullableSerializer(
                AComplexClassTaggedSerializable.Companion
            )
        ) // it's a variable used on the code above
    
  • // val stringArraySerializer= ArraySerializer(String.serializer())
    SerialDescriptor("EhEHSerializer", StructureKind.CLASS) {
            element<Int>("i")
            element<String>("txt")
            // element<Array<String>>("list") // kept here for future references for Array of primitive stuffs
            // element("arrComplexClass", AComplexClassTaggedSerializable.descriptor) // in case of Array of complex objects, a tag @Serializable and a companion object implementing Kserializable<AComplexClassTaggedSerializable> is needed
        }
    
    override fun serialize(encoder: Encoder, obj: EhEH){
        var ce = encoder.beginStructure(
            descriptor,
            Int.serializer(),
            String.serializer(),
            //stringArraySerializer, // kept here for future references for
            // serializerArray_AComplexClassTaggedSerializable
        )
        ce.encodeIntElement(descriptor, 0, obj.i)
        ce.encodeStringElement(descriptor, 1, obj.txt)
        /*ce.encodeSerializableElement(
            descriptor, 2,
            stringArraySerializer, obj.arrOfStrings
        )*/
        /*ce.encodeSerializableElement(
            descriptor, 3,
            serializerArray_AComplexClassTaggedSerializable,
            obj.arrComplexClass
        )*/
        ce.endStructure(descriptor)
    
    }
    
    val serializerArray_AComplexClassTaggedSerializable =
        ArraySerializer<AComplexClassTaggedSerializable, AComplexClassTaggedSerializable?>(
            NullableSerializer(
                AComplexClassTaggedSerializable.Companion
            )
        ) // it's a variable used on the code above
    
    var nse = NullableSerializer(AComplexClassTaggedSerializable)
    println( Cbor.dump(nse, someInstanceOfThatComplexClass ).toString())
    //and....
    var o = (Cbor.load(nse, "...here go something..") as EhEH
    // use "o"