EnumSets关于类版本化的特征是什么?

时间:2018-02-09 12:39:52

标签: java enums

javadoc以及此question都强调

  

枚举集在内部表示为位向量。

现在我想知道 - 通过网络发送(标准Java序列化的)EnumSet对象到可能具有不同版本的其他 JVM时的行为是什么潜在的Enum类?

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

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

我试图确定一个规范,告诉我应该发生什么(相对于假设这是一个实现细节),但到目前为止还没有运气。

1 个答案:

答案 0 :(得分:3)

仅关于实现(使用Oracle Java 8),答案是:它不是&#34;只是&#34;一个比特。

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

原来:

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

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

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