[英]Java serialization of a value in a Scala singleton object
我有 Scala 單例對象Works
和Broken
,它們看起來非常相似:
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.factory
是Works.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 = _;
類實例的引用的$outer
是A
,但是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.