Java:序列化单例的实际用例?

Java:序列化单例的实际用例?,java,serialization,singleton,use-case,Java,Serialization,Singleton,Use Case,我们一直在阅读如何使用“readResolve()”来确保序列化单例时的单例性。但是,想要序列化一个单例的实际用例是什么呢 编辑:pl.注意:问题是为什么要序列化一个单例,而不是什么是安全的方法。Joshua Bloch建议使用Enum作为单例。它总是由VM创建的,并且不可能(或很难)创建singleton的第二个实例 对于普通单身人士,您可以随时“破解”系统,请参阅: 最常见的情况是,您有一个表示大型数据结构的对象(例如,XML样式文档中的节点树) 此数据结构可以很容易地包含单例值(例如,表

我们一直在阅读如何使用“readResolve()”来确保序列化单例时的单例性。但是,想要序列化一个单例的实际用例是什么呢

编辑:pl.注意:问题是为什么要序列化一个单例,而不是什么是安全的方法。

Joshua Bloch建议使用Enum作为单例。它总是由VM创建的,并且不可能(或很难)创建singleton的第二个实例

对于普通单身人士,您可以随时“破解”系统,请参阅:


最常见的情况是,您有一个表示大型数据结构的对象(例如,XML样式文档中的节点树)

此数据结构可以很容易地包含单例值(例如,表示附加到树中节点的特定属性的数据类型的单例实例)。树中的许多不同节点可以指向相同的共享单例值

在许多情况下,您可能希望序列化此类数据结构,例如通过网络发送对象的副本。在这种情况下,还需要序列化单例值


但是,当您读回数据结构时,您希望使用singleton的现有值,而不是新创建的实例。这就是为什么需要
readResolve()

对象可能是一个单体,但它可能是一个更大结构的一部分,而这个结构并不十分清楚它是什么。例如,它可以实现一个接口,该接口可以有多个不同的实现(以及实例):

我们这样使用它:

MultiDumper dumper = new MultiDumper(StdoutStringSink.INSTANCE);

如果要序列化然后反序列化此转储程序,程序中将有两个
StdoutStringSink
实例浮动。

谢谢您的回答,但我的问题更多的是为什么序列化一个单例而不是如何序列化。将编辑问题以反映这一点。对于gwt、jpa、hibernate(例如:)和其他通过网络发送的框架。具体示例/链接将有所帮助。:)见答案。
interface StringSink extends Serializable { void dump(String s); }

class MultiDumper implements Serializable {
    private final StringSink sink;
    public MultiDumper(StringSink sink){ this.sink = sink; }
    void doSomeStuff(Collection<String> strings){
        for (String s : strings) sink.dump(s);
    }
}
/** Beware: Not good for serializing! */
class StdoutStringSink {
    public static final StdoutStringSink INSTANCE = new StdoutStringSink();
    private StdoutStringSink(){}
    @Override
    public void dump(String s){ System.out.println(s); }
}
MultiDumper dumper = new MultiDumper(StdoutStringSink.INSTANCE);