Scala 的单例对序列化都有哪些保证?

Posted

技术标签:

【中文标题】Scala 的单例对序列化都有哪些保证?【英文标题】:Which guarantees do Scala's singletons have regarding serialization?Scala 的单例对序列化有哪些保证? 【发布时间】:2011-08-25 16:09:52 【问题描述】:

默认情况下它是安全的,就像 Java 的单元素枚举模式一样,还是 e. G。是否需要在某处定义readResolve 或类似方法以防止单例合约意外或恶意破坏?

【问题讨论】:

【参考方案1】:

是的,默认是安全的:

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 - 这个问题与询问为什么默认情况下所有类型都不能序列化没有什么不同 - 有一个 Java 问题here。 我不同意。基本上只有一个(在 99.5% 的用例中)用于序列化单例模式的合理实现,如果需要,它很容易被覆盖。我只是想知道保存的这 140 个字节是否 很重要,默认情况下允许它破坏单例合同。

以上是关于Scala 的单例对序列化都有哪些保证?的主要内容,如果未能解决你的问题,请参考以下文章

高并发下线程安全的单例模式

高并发下线程安全的单例模式(最全最经典,值得收藏)

自己动手实现牛逼的单例模式

原创自己动手实现牛逼的单例模式

月薪5万程序员眼中的单例模式

单列模式