簡體   English   中英

Scala 單例對象中值的 Java 序列化

[英]Java serialization of a value in a Scala singleton object

我有 Scala 單例對象WorksBroken ,它們看起來非常相似:

object Works {
  def i = ???
  val factory = new Serializable {
    def get = i
  }
}

object Broken extends A

trait A {
  def i = ???
  val factory = new Serializable {
    def get = i
  }
}

我想了解的是為什么Works.factoryWorks.factory序列化的,而Broken.factory不是?

要序列化一個類,所有成員也必須是可序列化的。 但是,請考慮trait A匿名new Serializable -Xprint:jvm輸出

  final class anon$1 extends Object with java.io.Serializable {
    def get(): Nothing = anon$1.this.$outer.i();
    <synthetic> <paramaccessor> <artifact> private[this] val $outer: $line58.iw$A = _;
    def <init>($outer: $line58.iw$A): <$anon: Object> = {
      if ($outer.eq(null))
        throw null
      else
        anon$1.this.$outer = $outer;
      anon$1.super.<init>();
      ()
    }
  }

特別注意成員

<synthetic> <paramaccessor> <artifact> private[this] val $outer: $line58.iw$A = _;

類實例的引用的$outerA ,但是trait A沒有被宣布為Serializable 因此, Broken.factory引用的匿名類的序列化失敗。

另一方面,考慮object Works匿名new Serializable -Xprint:jvm輸出

  final class anon$1 extends Object with java.io.Serializable {
    def get(): Nothing = iw$Works.this.i();
    def <init>(): <$anon: Object> = {
      anon$1.super.<init>();
      ()
    }
  }

請注意,沒有不是Serializable成員(類似於$outer )。 因此Works.factory引用的匿名類的序列化成功。

解決方法是使 trait A像這樣可序列化

trait A extends Serializable { ... }

然而Java 對象序列化規范警告

出於多種原因,強烈建議不要對內部類(即,不是靜態成員類的嵌套類)(包括本地類和匿名類)進行序列化。 因為在非靜態上下文中聲明的內部類包含對封閉類實例的隱式非瞬態引用,序列化這樣的內部類實例也將導致其關聯的外部類實例的序列化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM