我正在研究Scala中的一些Sapark项目,并且看到所有对象都在扩展Serializable
。
就像:
object someName extends Serializable {
//some code
}
我了解到序列化通常用于存储或传递数据结构,以便可以将数据从序列化形式轻松地以原始形式加载到内存中。但是,在这种情况下,object
更像是Java类。那么,扩展Serializable
有什么意义或优势?你什么时候做的?总是需要这样做吗?
答案 0 :(得分:2)
仅在使用对象时真正需要它,而不是直接在对象上调用方法。例如。像
val x = someName
rdd.map { ... x ... }
或
object SomeName extends Serializable, SomeTrait { ... }
def f(x: SomeTrait) = ...
rdd.map { ... f(SomeName) ... }
对于不扩展任何类/特征的“全局” object
来说,这基本上是没有用的,因为没有人执行第一个摘要所示的内容,但也没有任何伤害。请注意,Nil
和None
是第二个示例,它们确实扩展了Serializable
(即使没有Spark)。
答案 1 :(得分:1)
在scala中,对象不是Java类,而是Java单例类,如果其内容需要通过网络发送,或者它们想写入文件,则它们类似于Java类。因此,它具有可序列化特征。
答案 2 :(得分:1)
case 对象和 case 类自动扩展Product
和Serializable
。有时由于类型推断的原因,使得ADT层次结构中的特征和抽象类扩展了Product
和Serializable
。
https://typelevel.org/blog/2018/05/09/product-with-serializable.html