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

时间:2011-06-11 21:11:25

标签: java scala serialization interface language-design

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

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

这不会有助于开发人员,因为

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

  
    

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

  

是的,你这样做。

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

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

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

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

答案 2 :(得分:-1)

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