【发布时间】:2021-04-04 10:01:35
【问题描述】:
我可以看到抽象类枚举实现了标记接口 Serializable 的 readObject() 方法,该方法抛出 InvalidObjectException。
private void readObject(ObjectInputStream in) throws IOException,
ClassNotFoundException {
throw new InvalidObjectException("can't deserialize enum");
}
private void readObjectNoData() throws ObjectStreamException {
throw new InvalidObjectException("can't deserialize enum");
}
我的理解是,在反序列化枚举时,我们会得到 InvalidObjectException。 但我能够反序列化我的枚举。
根据我的理解,如果提供了 readResolve() 方法实现,那么 jvm 在反序列化期间调用此方法,所以从技术上讲,我应该得到一个错误,但我得到的是对象。
我的代码:
enum Person50{
OBJECT;
}
private static void serializationSingletonEnum() throws Exception{
Person50 p50 = Person50.OBJECT;
System.out.println("hashCode 1:" +p50.hashCode());
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("enumFile.ser"));
oos.writeObject(p50);
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("enumFile.ser"));
Person50 p15 = (Person50)ois.readObject();
System.out.println("hashCode after:" +p15.hashCode());
}
输出:
hashCode 1:1435804085
hashCode after:1435804085
我可能会犯一些愚蠢的错误,或者我对序列化调用的理解可能不正确。
【问题讨论】:
标签: java serialization enums singleton deserialization