gpt4 book ai didi

java - EnumSets 在类版本控制方面的特点是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 20:08:39 26 4
gpt4 key购买 nike

javadoc还有这个question都强调

Enum sets are represented internally as bit vectors.

现在我想知道 - 通过网络将(标准 Java 序列化的)EnumSet 对象发送到某些 可能 具有不同版本的 JVM 时的行为是什么底层枚举类?

换句话说:当我发送了一些 Set<MyEnum>很可能在 other JVM 上的反序列化期间抛出异常(在 my JVM 使用一些 MyEnum.NEW_GUY 的情况下 other JVM 不知道)。在这种情况下,反序列化会尝试实例化其他 JVM 上的类中不存在的枚举常量。

但假设 EnumSet 不传输枚举常量实例(只是设置了一些位,有些位为真,有些位为假)——当序列化的 EnumSet 包含时会发生什么 MyEnum.NEW_GUY

我试图确定一个规范来告诉我应该发生什么(而不是假设这是一个实现细节),但到目前为止运气不好。

最佳答案

仅关于实现(使用 Oracle Java 8),答案是:它“不仅仅是”一个位集。

含义:可以快速编写将 EnumSet 实例序列化到文件中的测试,然后更改枚举类,并运行从文件中读回集合的代码。

结果:

  • 如果文件包含一个不再存在的枚举常量,则一个java.io.InvalidObjectException: enum constant B does not exist in class com.ibm.hwmca.z.managed.TestEnum 被抛出
  • 如果所有枚举常量都存在,但它们的顺序已更改 - 读回的集合仍然正确。

换句话说:该测试表明序列化的 EnumSet 确实包含比普通位集“更多”的信息。该实现能够 A) 检测“丢失的”枚举常量和 B) 处理仅影响条目排序的枚举类的更改。与@Seelenvirtuose 的评论相匹配,即序列化 EnumSet 不是位 vector ,而是一个包含实际枚举常量的数组(因此对于完全相同的版本冲突是开放的)。

仍在搜索观察到的行为是否有规范

关于java - EnumSets 在类版本控制方面的特点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48706070/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com