jms和不同版本的枚举

时间:2011-05-24 20:47:37

标签: java serialization enums jms

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

2 个答案:

答案 0 :(得分:3)

来自Java Object Serialization Specification version 6.0(强调是我的):

  

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

这意味着:

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

答案 1 :(得分:1)

如果我理解正确,包含枚举的对象将作为ObjectMessage的一部分发送。如果是这种情况,它使用通常的Java序列化来编码和解码枚举对象。

枚举的序列化按名称工作 - 即实际上它们正在发送枚举值的名称(以及其类的标识符)。只要实际发送的值在另一个接收方存在,就应该没有问题。

当然,您必须确保消息的含义不会因您的更改而改变。