Есть ли способ сериализации карты в Kotlinx-Serialization - PullRequest
0 голосов
/ 23 марта 2020

Я использую Kotlin 1.3.10 (и привязан к этой версии) и Kotlinx-Serialization 0.13, и у меня возникают проблемы с сериализацией карты в Kotlinx-Serialization.

У меня есть следующее code:

@Serializer(forClass = LocalDate::class)
object LocalDateSerializer : KSerializer<LocalDate> {
    private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
    override val descriptor: SerialDescriptor
        get() = StringDescriptor.withName("LocalDate")
    override fun serialize(encoder: Encoder, obj: LocalDate) {
        encoder.encodeString(obj.format(formatter))
    }
    override fun deserialize(decoder: Decoder): LocalDate {
        return LocalDate.parse(decoder.decodeString(), formatter)
    }
}

@Serializable
data class MyClass (
    val students: Map<String,LocalDate>
)

@UnstableDefault
@Test
fun decodeEncodeSerialization() {
    val jsonParser = Json(
        JsonConfiguration(
            allowStructuredMapKeys = true
        )
    )
    val mc = MyClass(
        mapOf("Alex" to LocalDate.of(1997,2,23))
        )

    val mcJson = jsonParser.stringify(MyClass.serializer(), mc)
    val mcObject = jsonParser.parse(MyClass.serializer(), mcJson)

    assert(true)
}

При проверке кода появляется красная линия: «Сериализатор не найден для« LocalDate ». Чтобы использовать контекстный сериализатор как запасной вариант, явно аннотируйте тип или свойство с помощью @ContextualSerialization».

Для других типов полей было бы достаточно добавить к нему @Serialization.

@Serializable
data class Student (
    val name: String,
    @Serializable(with = LocalDateSerializer::class)
    val dob: LocalDate
)

Но с картой я не могу понять, как. Я поставил его выше или рядом с объектом ...

@Serializable
data class MyClass (
    val students: Map<String,@Serializable(with = LocalDateSerializer::class) LocalDate> //here
    //or 
    //@Serializable(with = LocalDateSerializer::class)
    //val students2: Map<String, LocalDate> //here 
)

... но тесты по-прежнему не выполняются с

kotlinx.serialization.SerializationException: Не удается найти аргумент- меньше сериализатора для класса java .time.LocalDate (Kotlin отражение недоступно). Для обобщенных c классов, таких как списки, пожалуйста, предоставьте сериализатор явно.

И у меня есть обходной путь

@Serializable
data class MyClass (
    val students: List<Student>
)
@Serializable
data class Student (
    val name: String,
    @Serializable(with = LocalDateSerializer::class)
    val dob: LocalDate
)

Есть ли способ, по которому я бы не прибегал в обход? Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...