#直面Java# 第122期

问:

枚举的序列化是如何实现的?为什么枚举实现的单例不存在可能序列化破坏的问题。

解:

答案可以在Java Object Serialization Specification 中找到答案。其中专门对枚举的序列化做了规定。

大概意思就是:在序列化的时候Java仅仅是将枚举对象的name属性输出到结果中,反序列化的时候则是通过java.lang.Enum的valueOf方法来根据名字查找枚举对象。同时,编译器是不允许任何对这种序列化机制的定制的,因此禁用了writeObject、readObject、readObjectNoData、writeReplace和readResolve等方法。

普通的Java类的反序列化过程中,会通过反射调用类的默认构造函数来初始化对象。所以,即使单例中构造函数是私有的,也会被反射给破坏掉。由于反序列化后的对象是重新new出来的,所以这就破坏了单例。

但是,枚举的反序列化并不是通过反射实现的。所以,也就不会发生由于反序列化导致的单例破坏问题。

猜你喜欢

转载自blog.csdn.net/w372426096/article/details/82023443