Немного неясно из вопроса, имеете ли вы в виду java.io.Serializable
(на основе аналогии с Scala и "реализовать") или kotlinx.serialization.Serializable
(на основании второго абзаца и обсуждения в комментариях).
Во-первых, для Java one:
Я думаю, что вы должны сформулировать это так: почему классы данных не реализуют Serializable
по умолчанию ? Вы всегда можете добавить : Serializable
, если хотите.
Тогда вы можете заметить, что это не единственное место, где Kotlin требует, чтобы вы были более явными, чем Scala. Для другого примера класса данных вам нужно пометить свойства val
или var
, где Scala предполагает val
по умолчанию. А для классов, не относящихся к данным, Scala позволяет вам использовать не-val
параметры конструктора внутри класса, эффективно переводя их в private val
, где Kotlin нет.
Для Serializable
в в частности:
Это даст привилегию Java сериализация с плохой репутацией (как уже упоминалось в комментариях).
Serializable
не может использоваться в кроссплатформенных (или просто Kotlin / JS или Kotlin / Native) проектах. Возможно, классы данных могли бы быть сериализуемыми только на JVM, но это было бы ненужным несоответствием между платформами.
классы case реализуют Serializable
, даже если они имеют не Serializable
свойства и будут бросить, если вы на самом деле пытаетесь их сериализовать.
В общем случае нескольких классов, расширяющих черту, если вы забыли сделать черту, extends Product with Serializable
вывод типа часто дает уродливые типы .
Для сериализации Kotlin ответ еще проще: вам не нужно, чтобы базовая языковая функция c, такая как классы данных, зависела от экспериментальной и незрелой библиотеки. Я не удивлюсь, если классы данных станут @Serializable
по умолчанию, когда они "закончатся", как сопрограммы в 1.3.