【发布时间】:2018-02-09 12:39:51
【问题描述】:
枚举集在内部表示为位向量。
现在我想知道 - 当通过线路将(标准 Java 序列化)EnumSet 对象发送到一些 其他 JVM 时,可能有不同版本的底层枚举类?
换句话说:当我发送一些Set<MyEnum> 时,很有可能在 other JVM 上的反序列化期间抛出异常(如果 my JVM 正在使用 other JVM 不知道的一些MyEnum.NEW_GUY)。在这种情况下,反序列化会尝试实例化 other JVM 上的类中不存在的枚举常量。
但假设 EnumSet 不传输枚举常量实例(但只是设置了一些位为真,一些位为假) - 当序列化 EnumSet 包含 MyEnum.NEW_GUY 时会发生什么?
我试图确定一个规范来告诉我应该发生什么(而不是假设这是一个实现细节),但到目前为止还没有运气。
【问题讨论】:
-
“但假设 EnumSet 不传输枚举常量实例” 查看源码(JDK9),情况并非如此。它使用一个序列化代理来保存元素类型
Class和一个常量数组。 -
根据源码:从流中读取对象后重新计算位向量。序列化仅将枚举值的数组写入流(除了枚举类)。这意味着您可以更改枚举值的顺序,也可以添加新的枚举值,只要您没有在集合中序列化它们。