#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
том, что я вижу только следующие варианты:
- Создайте свой собственный сериализуемый класс местоположения и используйте его вместо этого:
@Serializable(with = MyLocationSerializer::class) class MyLocation(provider: String): Location(provider)
и
var wpts : ArrayList<MyLocation>
- Создайте пользовательский сериализатор для
ArrayList<Location>
. - Используйте Gson или другую библиотеку сериализации.