#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 .