Как сериализовать список массивов пользовательского типа?

#android #kotlin #serialization

Вопрос:

У меня есть занятие с этим участником:

 var wpts : ArrayList<Location>
 

Я также создал пользовательский сериализатор:

 object LocationSerializer: KSerializer<Location>{
        override val descriptor = buildClassSerialDescriptor("Location") {
            element<Double>("lat")
            element<Double>("lon")
        }

        override fun deserialize(decoder: Decoder): Location = decoder.decodeStructure(descriptor) {
            var lat = -1.0
            var lon = -1.0
            while (true) {
                when (val index = decodeElementIndex(descriptor)) {
                    0 -> lat = decodeDoubleElement(descriptor, 0)
                    1 -> lon = decodeDoubleElement(descriptor, 1)
                    CompositeDecoder.DECODE_DONE -> break
                    else -> error("Unexpected index: $index")
                }
            }
            require(lat in -90.0..90.0 amp;amp; lon in -180.0..180.0)
            val l = Location("")
            l.latitude = lat
            l.longitude = lon
            return l
        }

        override fun serialize(encoder: Encoder, value: Location) = encoder.encodeStructure(descriptor) {
            encodeDoubleElement(descriptor, 0, (value.latitude))
            encodeDoubleElement(descriptor, 1, (value.longitude))
        }

    }
 

Я не знаю, как определить сериализатор для члена wpts, и добавление этой аннотации не работает:

 @Serializable(with = Serializers.Companion.LocationSerializer::class)
 

Я продолжаю получать эту ошибку:

Сериализатор не найден для типа «Местоположение».

Комментарии:

1. Я думаю, что вы можете использовать GSON для этого случая использования.

2. @OhhhThatVarun Gson устарел, он больше не поддерживается, а также плохо работает с гарантиями обнуления Kotlin в целом. Я бы не советовал его использовать.

3. @Джоффри, кто тебе сказал, что GSON на самом деле не поддерживается?

Ответ №1:

Предполагая , что вы говорите о android.location.Location том, что я вижу только следующие варианты:

  1. Создайте свой собственный сериализуемый класс местоположения и используйте его вместо этого:
     @Serializable(with = MyLocationSerializer::class)
    class MyLocation(provider: String): Location(provider)
     

    и

     var wpts : ArrayList<MyLocation>
     
  2. Создайте пользовательский сериализатор для ArrayList<Location> .
  3. Используйте Gson или другую библиотеку сериализации.