【问题标题】:Why does scala.Serializable not specify any methods?为什么 scala.Serializable 没有指定任何方法?
【发布时间】:2011-09-13 04:44:34
【问题描述】:

因为 Java 语言要求所有接口成员都是公开的,并且最初的设计者不想强制 java.io.Serializable 的“方法”公开,所以这在 Java 中是不可能的。

Scala 没有此限制,但 readObject/writeObject 之类的内容仍未在 scala.Serializable 特征中指定。

这对开发人员没有帮助吗,因为

  • 他们保证他们的签名是正确的
  • 这将使访问这些方法变得不那么尴尬。

还是我错过了一些重要的事情?

【问题讨论】:

标签: java scala serialization interface language-design


【解决方案1】:

还是我错过了一些重要的事情?

是的,你会的。

readObject/writeObject 方法必须是私有的,并且不能被覆盖以使机制正常工作。

它们也以相反的方式被调用(即超类->类)。此外,您确实希望该方法保持私有以防止滥用(和显式调用)

Serializable 机制也提供了其他方法:比如 writeReplace+readResolve,通常不在同一个类中使用 + readObjectNoData(没那么有用)。

现在,如果您需要特定方法,请查看 java.io.Externalizable。它确实发布了它的方法,并且实现它会覆盖默认的序列化机制。

【讨论】:

    【解决方案2】:

    从 Java 背景回答,但我猜同样的推理也适用于 Scala:Java 不需要标记为 Serializable 的方法来实现任何方法;运行时本身提供序列化机制。这就是为什么界面是空的。 readObject 和 writeObject 不是 Serializable 的一部分,不是因为它们不是公共的,而是因为从 Serializable 派生的对象不需要实现它们。

    Serializable 真的不应该是一个接口,而是一个注解(特别是因为从 Serializable 类派生的类很可能不是本身就是 Serializable),但它在语言之前是语言的一部分有注释。

    【讨论】:

      【解决方案3】:

      在序列化中没有公开的方法。您可以实现四种方法,但它们都是可选的。你的问题没有意义。

      【讨论】:

      • @downvoter OK 它是什么? (1) 有方法可以在序列化中公开吗?如果有,请给他们命名。一个会做的。 (2) 您可以实现的四种方法都不是可选的吗?如果有,请说明有多少,如果有的话,并命名。 (3) 考虑到 (1) 和 (2) 的问题,问题 是否 有意义?请。
      猜你喜欢
      • 2011-12-03
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多