为啥 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 没有指定任何方法?的主要内容,如果未能解决你的问题,请参考以下文章