Size: a a a

Kotlin Community

2020 October 29

LS

Leonard Startsev in Kotlin Community
Lev Shagalov
А так же: как при сериализации всегда заставлять сериализатор добавлять classDiscriminator? Я сериализую без полиморфизма, но результаты я получаю уже "с полиморфизмом" и понять что я получил могу только по classDiscriminator
а в чем проблема сериализовать изначально с полиморфизмом? просто статически приведите объект к типу интерфейса
источник

LS

Leonard Startsev in Kotlin Community
Lev Shagalov
А так же как указывать свое значение classDiscriminator без @SerialName?
никак. или вы про ключ "type"? тогда в конфигурации JSON'а
источник

LS

Leonard Startsev in Kotlin Community
Lev Shagalov
И как десериализовать JsonObject, содержащий classDiscriminator? Я обернул его в еще один Json и тогда смог десериализовать с полиморфизмом. Но это костылище какой то.
этого я вообще не понял, в чем проблема JsonObject'a ?
источник

LS

Leonard Startsev in Kotlin Community
Lev Shagalov
Библиотека (основной код которой в common и она должна работать и в jvm и в js желательно) объявляет интерфейс Entity. Библиотека используется в проекте, который объявляет кучу классов-наследников Entity, иногда у них так же есть наследники.

В библиотеке объявлен класс Result в свойстве которого может быть любой наследник Entity.

Как я понимаю, мне надо https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/polymorphism.md#serializing-interfaces и для этого надо всех наследников указывать вот в такой конструкции
val module = SerializersModule {
   polymorphic(Project::class) {
       subclass(OwnedProject::class)
   }
}

Что ну ... не очень удобно чтоли. Мне посоветовали, что можно достать все классы через kapt, в котором я как то сходу не разобрался. Можете ткнуть менять в капт или может есть еще вариант?
создайте для библиотеки и проекта разные модули, их можно складывать
источник

Sergey λ in Kotlin Community
источник

LS

Lev Shagalov in Kotlin Community
Leonard Startsev
а в чем проблема сериализовать изначально с полиморфизмом? просто статически приведите объект к типу интерфейса
Не пришло в голову. Вроде сработало.
источник

LS

Lev Shagalov in Kotlin Community
Leonard Startsev
никак. или вы про ключ "type"? тогда в конфигурации JSON'а
Именно про значение. Ок, тогда буду через @SerialName
Ну или свою мапу сериализаторов (свой SerializersModule) сделаю
источник

LS

Lev Shagalov in Kotlin Community
Leonard Startsev
создайте для библиотеки и проекта разные модули, их можно складывать
Я имел ввиду сделать как то без SerializersModule, то есть без перечисления классов, а чтобы оно само сообразило и нашло.
источник

LS

Leonard Startsev in Kotlin Community
Lev Shagalov
Я имел ввиду сделать как то без SerializersModule, то есть без перечисления классов, а чтобы оно само сообразило и нашло.
делайте sealed ¯\_(ツ)_/¯ или рефлексией
источник

LS

Lev Shagalov in Kotlin Community
Leonard Startsev
делайте sealed ¯\_(ツ)_/¯ или рефлексией
Sealed никак. Классы в разных файлах.
А рефлексией так можно сделать в common?
источник

LS

Leonard Startsev in Kotlin Community
в common — нет
источник

LS

Lev Shagalov in Kotlin Community
А через actual так можно сделать в js и jvm по отдельности?
источник

LS

Leonard Startsev in Kotlin Community
от классов может унаследоваться кто угодно в любых других модулях. а вы хотите их все перечислить? где-то логическая несостыковка
источник

LS

Lev Shagalov in Kotlin Community
Мне надо сущности десериализовать из базы данных. Но я наперед не знаю какие прилетят (вот такая база). Могу определить по classDiscriminator.

Я их перечислю для определенного приложения. В этом месте будет известно какие модули подключены.
источник

LS

Leonard Startsev in Kotlin Community
так кто вам мешает в приложении создать инстанс serializersModule ?
источник

LS

Lev Shagalov in Kotlin Community
А ну... дык я как раз не хочу их перечислять. ) Я хочу чтобы оно автоматом сообразило))

Извиняюсь, я не корректно выражался, ввел в заблуждение. Я не хочу их перечислять. Вы сказали что можно через рефлексию. Но в common нельзя. А может можно в js и jvm по отдельности? Или может есть планы, что это можно будет сделать в js а пока есть только в jvm

Мне подсказали, что такое можно сделать через kapt, но я пока не могу в нем разобраться.
источник

LS

Leonard Startsev in Kotlin Community
в js нет ни достаточной рефлексии, ни kapt
источник

LS

Leonard Startsev in Kotlin Community
так что увы всё ручками
источник

LS

Lev Shagalov in Kotlin Community
Может, я хотя бы могу это сделать как то на месте? Около объявления класса? В список как то добавить... или типа того. Будет такая псевдо-аннотация %)
источник

LS

Lev Shagalov in Kotlin Community
Если я над каждым классом допишу нечто вроде someList.add(ThatEntity::class)
А потом при старте приложения прочитаю этот someList и использую для SerializersModule - это сработает? Или там будет засада с порядком исполнения someList.add ? И где тогда такой someList надо объявлять?
источник