枚举集在内部表示为位向量。
现在我想知道 - 通过网络发送(标准Java序列化的)EnumSet对象到可能具有不同版本的其他 JVM时的行为是什么潜在的Enum类?
换句话说:当我发送一些Set<MyEnum>
时,很有可能在其他 JVM的反序列化期间抛出异常(在 my <的情况下) / em> JVM正在使用其他 JVM不知道的一些MyEnum.NEW_GUY
。在这种情况下,反序列化尝试实例化其他 JVM上的类中不存在的枚举常量。
但假设EnumSet不传输枚举常量实例(但只是设置了一些位为真,有些是假的) - 当序列化的EnumSet包含MyEnum.NEW_GUY
时会发生什么?
我试图确定一个规范,告诉我应该发生什么(相对于假设这是一个实现细节),但到目前为止还没有运气。
答案 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不是一个位向量,而是一个包含实际枚举常量的数组(因此对于完全相同的版本冲突是开放的)。
仍在搜索观察到的行为是否存在规范。