8

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.

  1. Qual è il vantaggio, se poniamo @transient sulla non inizializzata lazy val durante la serializzazione esso?

  2. Ha senso creare un transitorio non inizializzato val per la serializzazione, sapendo che nulla verrà serializzato, come nell'esempio sopra riportato?

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

risposta