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

soc*_*soc 12 java serialization scala language-design interface

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

Scala没有这个限制,但事情好像readObject/ writeObject仍未在指定的scala.Serializable特质.

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

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

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

ant*_*oft 5

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

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


bes*_*sss 5

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

是的你是.

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

它们也以相反的方式调用(即超类 - >类).你还希望这个方法保持私有,以防止滥用(和显式调用)

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

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