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