为什么数据类不实现可序列化?

jav*_*dba 5 serialization kotlin

我是新来的kotlin,但一个老将scala。到目前为止,前者给我留下了深刻的印象。但此刻我正在解决一个令人头疼的问题——data class它没有实现Serializable。我知道如何期望具有该名称的类不会经常以这种方式使用。

排除该支持的技术挑战是什么?我很感兴趣,因为我想创建一个包装器。似乎期望总是提供一个serializer()? 这很麻烦,实际上kotlinx.serialization还没有为我工作 - 即使经过一些努力。

Ale*_*nov 6

如果您的意思是java.io.Serializable(基于与 Scala 和“实现”的类比)或kotlinx.serialization.Serializable(基于第二段和评论中的讨论),这个问题有点不清楚。

首先,对于Java:

我认为你应该说的方式是:为什么Serializable 默认情况下数据类不实现?: Serializable如果需要,您可以随时添加。

然后你可以注意到,这并不是 Kotlin 要求你比 Scala 更明确的唯一地方。对于另一个数据类示例,您需要标记Scala默认假定的属性valvar其中的属性val。对于非数据类,Scala 允许您val在类中使用非构造函数参数,有效地将它们提升到private valKotlin 没有的地方。

对于Serializable具体为:

  1. 它将优先考虑声誉不佳的 Java 序列化(如评论中所述)。

  2. Serializable不能用于跨平台(或仅 Kotlin/JS 或 Kotlin/Native)项目。也许数据类只能在 JVM 上序列化,但这将是平台之间不必要的不​​匹配。

  3. Serializable即使case 类具有非Serializable属性,它们也会实现,并且如果您实际尝试序列化它们,则会抛出异常。

  4. 在扩展一个特征的多个案例类的常见情况下,如果您忘记进行特征extends Product with Serializable类型推断,通常会给出丑陋的类型

对于 Kotlin Serialization,答案甚至更简单:您不希望数据类等基本语言功能依赖于实验性和不成熟的库。如果数据类@Serializable在像协程在 1.3 中那样“毕业”时成为默认值,我不会感到惊讶。