Котлиновская сериализация позволяет сериализовать-...
# russian
l
Котлиновская сериализация позволяет сериализовать-десериализовать объекты только когда точно известен класс объекта. Как бы сделать так, чтобы при десериализации мы не указывали конкретный класс, а оно бы само его определило по какому либо специальному полю (так же как и свойства свойства, тип которых интерфейс)? А потому уже when и все такое. Как я понимаю, сейчас это можно сделать передав два поля - класс и строку, и по классу найти десериализатор. Но для вложенных это не прокатит. Хотя бы для JSON @sandwwraith
a
l
@irus Видимо да
i
PolymorphicSerializer не то что нужно?
l
Если я понимаю правильно https://github.com/Kotlin/kotlinx.serialization/issues/385 Это не даст мне рассериализовать список объектов разных классов с одним интерфейсом.
s
А при чём тут оно? Вам скорее это надо. https://github.com/Kotlin/kotlinx.serialization/pull/394 Сейчас оно работает, но только для jvm и в виде [тип, объект], а не тип внутри объекта
l
@sandwwraith Ну, если внутри jvm это хорошо. Но надо и для типов внутри объекта. Собственно как раз чтобы оно могло List<Any> превратить в список разнородных объектов
s
это оно может
вот если у вас на месте Any окажется тип, который сам имеет генерик параметры, тогда проблемки
l
А.. генерик в генерике не может?
s
Полиморфно сериализовать генерик класс
т.е. с записью его типа
l
Ну List то она может
сериализовать
так...
s
дак List не надо полиморфно сериализовывать) только его элементы
l
Copy code
open class C
class A:C()
class B:C()

fun main() {
    listOf<C>(A(),B())
    //типа Сериализовал-десериализовал
    val deserializedList = listOf<C>()
    deserializedList.forEach {
        when (it){
          is A -> TODO()
          is B -> TODO()
        }
    }
}
Вот этот when таки отработает?
s
должен
l
А так
Copy code
open class C
class A:C()
class B:C()
data class D (
	val someOfC: C
)

fun main() {
	val original = D(A())
    //Я это сериализую-десериализую
    deserialized.someOfC is A
}
s
тоже
l
Хм... таки че то для этого надо делать? Я могу ослепнуть и не увидеть этого в доках.
s
вроде из коробки сейчас должно работать, но это не точно
l
То есть просто @Serializable и все. Ну ок, я как нить проверю