为啥 scala.Serializable 没有指定任何方法?

Posted

技术标签:

【中文标题】为啥 scala.Serializable 没有指定任何方法?【英文标题】: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 中可以有空接口。 Serializable is empty. @Matt Ball 但你不能在接口中使用私有方法。但是好问题(我感觉我知道这个问题的来源;-)),希望我们能得到一些有趣的答案 @Matt java.io.Serializable 之所以为空,是因为他们不想强制这些方法公开。我会澄清的。 @Voo...这个问题从何而来? :-) @Swarange: ***.com/questions/6317941/…, ***.com/questions/6317896/… 和 ***.com/questions/6256608/… 可能 【参考方案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) 的问题,问题 是否 有意义?请。

以上是关于为啥 scala.Serializable 没有指定任何方法?的主要内容,如果未能解决你的问题,请参考以下文章

为啥新款的Macbook pro的触摸板没有了三指拖动的功能

云服务器,网站域名没有备案为啥就无法访问呢?

云服务器,网站域名没有备案为啥就无法访问呢?

云服务器,网站域名没有备案为啥就无法访问呢?

云服务器,网站域名没有备案为啥就无法访问呢?

为啥 Enumerable 在 Ruby 中没有长度属性?