14
默認情況下是安全的,比如Java的單元素枚舉模式或者是e。 G。需要在某處定義readResolve
或類似的方法來防止意外或惡意破壞單身合同?Scala的單身人士對於序列化有哪些保證?
默認情況下是安全的,比如Java的單元素枚舉模式或者是e。 G。需要在某處定義readResolve
或類似的方法來防止意外或惡意破壞單身合同?Scala的單身人士對於序列化有哪些保證?
是的,它是安全的默認:
object Singleton extends Serializable
// with Scala 2.8: @serializable object Singleton
import java.io._
val out = new ObjectOutputStream(new FileOutputStream("singleton"))
out.writeObject(Singleton)
out.close
val in = new ObjectInputStream(new FileInputStream("singleton"))
val obj = in.readObject
in.close
obj == Singleton // should print true
當您編譯scalac對象和反編譯它(例如用JAD),你會得到下面的Java文件:
public final class Singleton$ implements Serializable, ScalaObject
{
public Object readResolve()
{
return MODULE$;
}
private Singleton$()
{
}
public static final Singleton$ MODULE$ = new Singleton$1();
}
爲什麼是'Singleton'默認情況下不可序列化? – soc 2011-05-15 18:45:42
@soc - 這個問題沒有什麼不同,爲什麼所有類型默認情況下都是不可序列化的 - 這裏有一個Java問題[here](http://stackoverflow.com/questions/441196/why-java-needs-序列化接口)。 – McDowell 2011-05-15 19:09:03
我不同意。基本上只有一個(在99.5%的用例中)明智地實現了對單例模式的序列化,如果需要,它很容易被覆蓋。我只是想知道,這140字節保存是否是_that_重要的是默認情況下允許打破單身合同。 – soc 2011-05-15 20:59:46