https://kotlinlang.org logo
#russian
Title
# russian
l

lewik

03/02/2019, 12:01 PM
Котлиновская сериализация позволяет сериализовать-десериализовать объекты только когда точно известен класс объекта. Как бы сделать так, чтобы при десериализации мы не указывали конкретный класс, а оно бы само его определило по какому либо специальному полю (так же как и свойства свойства, тип которых интерфейс)? А потому уже when и все такое. Как я понимаю, сейчас это можно сделать передав два поля - класс и строку, и по классу найти десериализатор. Но для вложенных это не прокатит. Хотя бы для JSON @sandwwraith
a

altavir

03/02/2019, 6:13 PM
l

lewik

03/03/2019, 12:47 PM
@irus Видимо да
i

irus

03/03/2019, 1:04 PM
PolymorphicSerializer не то что нужно?
l

lewik

03/03/2019, 1:08 PM
Если я понимаю правильно https://github.com/Kotlin/kotlinx.serialization/issues/385 Это не даст мне рассериализовать список объектов разных классов с одним интерфейсом.
s

sandwwraith

03/03/2019, 1:17 PM
А при чём тут оно? Вам скорее это надо. https://github.com/Kotlin/kotlinx.serialization/pull/394 Сейчас оно работает, но только для jvm и в виде [тип, объект], а не тип внутри объекта
l

lewik

03/03/2019, 1:20 PM
@sandwwraith Ну, если внутри jvm это хорошо. Но надо и для типов внутри объекта. Собственно как раз чтобы оно могло List<Any> превратить в список разнородных объектов
s

sandwwraith

03/03/2019, 1:20 PM
это оно может
вот если у вас на месте Any окажется тип, который сам имеет генерик параметры, тогда проблемки
l

lewik

03/03/2019, 1:20 PM
А.. генерик в генерике не может?
s

sandwwraith

03/03/2019, 1:21 PM
Полиморфно сериализовать генерик класс
т.е. с записью его типа
l

lewik

03/03/2019, 1:21 PM
Ну List то она может
сериализовать
так...
s

sandwwraith

03/03/2019, 1:21 PM
дак List не надо полиморфно сериализовывать) только его элементы
l

lewik

03/03/2019, 1:24 PM
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

sandwwraith

03/03/2019, 1:25 PM
должен
l

lewik

03/03/2019, 1:27 PM
А так
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

sandwwraith

03/03/2019, 1:27 PM
тоже
l

lewik

03/03/2019, 1:28 PM
Хм... таки че то для этого надо делать? Я могу ослепнуть и не увидеть этого в доках.
s

sandwwraith

03/03/2019, 1:28 PM
вроде из коробки сейчас должно работать, но это не точно
l

lewik

03/03/2019, 1:29 PM
То есть просто @Serializable и все. Ну ок, я как нить проверю
23 Views