使用或不使用 @transient 序列化惰性 val 时的差异

Posted

技术标签:

【中文标题】使用或不使用 @transient 序列化惰性 val 时的差异【英文标题】:Difference when serializing a lazy val with or without @transient 【发布时间】:2016-04-18 13:50:30 【问题描述】:

在spark上工作,有时我需要在每个任务中发送一个不可序列化的对象。

一个常见的模式是@transient lazy val,例如

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))

我发现这里不需要@transientlazy val 已经可以在每个任务执行时创建不可序列化。但人们建议使用@transient

    如果我们在序列化时将@transient设置在未初始化的lazy val上,有什么好处?

    知道没有任何东西会被序列化,就像上面的例子一样,为序列化创建一个未初始化的val 瞬态是否有意义?

    @transient lazy val 如何序列化?它被视为一种方法还是其他东西?

关于序列化@transient lazy val的一些细节和编译的java字节码很棒。

【问题讨论】:

【参考方案1】:

请看这里 - http://fdahms.com/2015/10/14/scala-and-the-transient-lazy-val-pattern/

在 Scala 中,lazy val 表示一个字段,该字段仅在第一次访问时才会计算,然后存储以供将来参考。另一方面,@transient 可以表示不应序列化的字段。

【讨论】:

以上是关于使用或不使用 @transient 序列化惰性 val 时的差异的主要内容,如果未能解决你的问题,请参考以下文章

Java拾遗Java transient关键字

Java transient关键字使用小记

Transient修饰符的使用

transient的用途及使用方法

Transient关键字的使用

transient关键字有何作用