Lavorando sulla scintilla, a volte ho bisogno di inviare un oggetto non serializzabile in ogni attività.Differenza durante la serializzazione di una lazy val con o senza @transient
Un modello comune è @transient lazy val
, per esempio
class A(val a: Int)
def compute(rdd: RDD[Int]) = {
// lazy val instance = {
@transient lazy val instance = {
println("in lazy object")
new A(1)
}
val res = rdd.map(instance.a + _).count()
println(res)
}
compute(sc.makeRDD(1 to 100, 8))
ho trovato che @transient
non è necessario qui. lazy val
può già creare il non serializzabile su ogni attività viene eseguita. Ma le persone suggeriscono di usare @transient
.
Qual è il vantaggio, se poniamo
@transient
sulla non inizializzatalazy val
durante la serializzazione esso?Ha senso creare un transitorio non inizializzato
val
per la serializzazione, sapendo che nulla verrà serializzato, come nell'esempio sopra riportato?Come è serializzato un
@transient lazy val
? Viene trattato come un metodo o qualcos'altro?
Alcuni dettagli sulla serializzazione @transient lazy val
e il bytecode Java compilato è impressionante.