0

次のカスタム サンプル クラスでKotlin のシリアル化パッケージの 1 つを使用しようとしていました。List実際のクラス (これもシリアル化する必要があります) を追加することで、実際のユース ケースに合わせてこのクラスを拡張しますが、現時点では、問題は単純にシリアル化解除にあります。私はシリアル化を機能させることができました(コードの2番目のスニペットには、シリアル化されるオブジェクトと結果の両方がありますString)、逆シリアル化プロセスは同じ方法で(つまり、インスタンスを使用して)行う必要があるようですof 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

インターネット全体でこの問題を抱えているのは私だけですか?

4

1 に答える 1