Java 中枚举类型的默认反序列化被限制为readObject
和readObjectNoData
throw InvalidObjectException
。出于这个原因,枚举类型非常适合实现没有任何缺陷的单例类(Item 77, Effective Java, 2nd Edition, Bloch)。
- 为什么,首先,枚举类型实现
Serializable
完全实现? - 在实践中应该如何反序列化枚举引用?
Java 中枚举类型的默认反序列化被限制为readObject
和readObjectNoData
throw InvalidObjectException
。出于这个原因,枚举类型非常适合实现没有任何缺陷的单例类(Item 77, Effective Java, 2nd Edition, Bloch)。
Serializable
完全实现?枚举类型实现Serializable
,因此您可以序列化包含枚举常量的对象。枚举常量的反序列化方式与任何其他对象相同:使用ObjectInputStream.readObject()
. 枚举常量的编码方式与普通类的实例不同,因此ObjectInputStream.readObject()
可以在不调用它们的readObject
方法的情况下反序列化它们。还有其他使用特殊编码的类,其中包括String
和Class
。有关更多详细信息,请参阅文档。
如果您想自己实现可序列化的单例类,请查看readResolve
方法。