【问题标题】:Deserializing enum in Java [duplicate]在Java中反序列化枚举[重复]
【发布时间】: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


    【解决方案1】:

    它起作用的原因是 Enum 序列化过程忽略了 readObject() 实现

    根据official documentaion

    1.12 枚举常量的序列化 枚举常量的序列化不同于普通的可序列化或可外部化的对象。这 枚举常量的序列化形式仅由其名称组成;场地 常量的值不存在于表单中。序列化一个 枚举常量,ObjectOutputStream 写入返回的值 枚举常量的名称方法。要反序列化枚举常量, ObjectInputStream 从流中读取常量名;这 然后通过调用 java.lang.Enum.valueOf 方法,传递常量的枚举类型 将接收到的常量名称作为参数。像其他可序列化的 或可外部化的对象,枚举常量可以作为目标 随后出现在序列化流中的反向引用。

    枚举常量序列化的过程不能 定制:任何特定于类的 writeObject、readObject、 定义的 readObjectNoData、writeReplace 和 readResolve 方法 枚举类型在序列化和反序列化期间被忽略。 同样,任何 serialPersistentFields 或 serialVersionUID 字段 声明也被忽略——所有枚举类型都有一个固定的 serialVersionUID 为 0L。记录可序列化的字段和数据 枚举类型是不必要的,因为类型没有变化 发送的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-10
      • 2013-09-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 2015-07-26
      相关资源
      最近更新 更多