jms 和不同版本的枚举

sr1*_*sr1 2 java enums serialization jms

我的团队通过 jms 向公司中的另一个团队提供服务。这涉及到作为更大对象的一部分传递给我们的枚举。他们很快就会改变枚举的定义——但是,我想先改变它,这样我就可以在改变前几天让我们的服务在生产中运行。更改将只涉及在最后添加另一个常量。我可以安全地做到这一点吗?

Tom*_*icz 6

来自Java 对象序列化规范 6.0 版(重点是我的):

枚举常量的序列化形式仅由其名称组成;[...]。要序列化枚举常量,请ObjectOutputStream写入枚举常量的name方法返回。要反序列化枚举常量,请ObjectInputStream从流中读取常量名称;然后通过调用 java.lang.Enum.valueOf 方法获得反序列化的常量,将常量的枚举类型与接收到的常量名称一起作为参数传递。

这意味着:

  • 在序列化方面向后添加新值enum 向后兼容的
  • 重新排序现有enum向后兼容的(与使用 的默认 JPAenum持久性策略相反ordinal()
  • 从中删除值enum 通常不向后兼容,因为删除的值可能已经用于序列化目的
  • 重命名enum向后兼容(见上文)