Почему классы данных не поддерживают Serializable? - PullRequest
3 голосов
/ 08 апреля 2020

Я новичок в kotlin, но ветеран scala. Первый впечатлил меня до сих пор. Но в данный момент я работаю через голову царапины - что data class не реализует Serializable. То, как класс с таким именем мог ожидать, что , а не будет обычно использоваться таким образом, ускользает от меня.

Какие технические проблемы препятствовали такой поддержке? Я заинтересован, потому что я хотел бы создать обертку. Кажется, что ожидание всегда предоставлять serializer()? Это громоздко и на самом деле kotlinx.serialization у меня пока не работает - даже после некоторых усилий.

1 Ответ

3 голосов
/ 08 апреля 2020

Немного неясно из вопроса, имеете ли вы в виду java.io.Serializable (на основе аналогии с Scala и "реализовать") или kotlinx.serialization.Serializable (на основании второго абзаца и обсуждения в комментариях).

Во-первых, для Java one:

Я думаю, что вы должны сформулировать это так: почему классы данных не реализуют Serializable по умолчанию ? Вы всегда можете добавить : Serializable, если хотите.

Тогда вы можете заметить, что это не единственное место, где Kotlin требует, чтобы вы были более явными, чем Scala. Для другого примера класса данных вам нужно пометить свойства val или var, где Scala предполагает val по умолчанию. А для классов, не относящихся к данным, Scala позволяет вам использовать не-val параметры конструктора внутри класса, эффективно переводя их в private val, где Kotlin нет.

Для Serializable в в частности:

  1. Это даст привилегию Java сериализация с плохой репутацией (как уже упоминалось в комментариях).

  2. Serializable не может использоваться в кроссплатформенных (или просто Kotlin / JS или Kotlin / Native) проектах. Возможно, классы данных могли бы быть сериализуемыми только на JVM, но это было бы ненужным несоответствием между платформами.

  3. классы case реализуют Serializable, даже если они имеют не Serializable свойства и будут бросить, если вы на самом деле пытаетесь их сериализовать.

  4. В общем случае нескольких классов, расширяющих черту, если вы забыли сделать черту, extends Product with Serializable вывод типа часто дает уродливые типы .

Для сериализации Kotlin ответ еще проще: вам не нужно, чтобы базовая языковая функция c, такая как классы данных, зависела от экспериментальной и незрелой библиотеки. Я не удивлюсь, если классы данных станут @Serializable по умолчанию, когда они "закончатся", как сопрограммы в 1.3.

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