Почему вы расширяете Serializable в Scala?

#java #scala #serialization #deserialization

#java #scala #сериализация #десериализация

Вопрос:

Я просматриваю некоторые проекты Sapark в Scala, и я вижу, что все объекты расширяются Serializable .

Это как :

 object someName extends Serializable {
//some code
}
 

Я понимаю, что сериализация часто используется для хранения или передачи структур данных, чтобы данные можно было легко загружать в память в исходном виде из сериализованной формы. Однако в этом случае object он больше похож на класс Java. Итак, в чем смысл или преимущество расширения Serializable ? Когда вы это делаете? Нужно ли всегда это делать?

Ответ №1:

объекты case и классы case расширяются Product и Serializable автоматически. Иногда черты и абстрактные классы из иерархии ADT создаются для расширения Product и Serializable по причинам вывода типов.

https://typelevel.org/blog/2018/05/09/product-with-serializable.html

Ответ №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).

Ответ №3:

В scala объекты не похожи на java class, они похожи на java singleton class, если его содержимое требовалось для отправки по сети или они хотели записать в файл. Итак, он был расширен с помощью Serializable trait .