我的团队通过jms为公司的其他团队提供服务。这涉及一个枚举,它作为一个更大的对象的一部分传递给我们。他们很快就会改变枚举的定义 - 但是,我想先改变它,这样我就可以在改变前几天让我们的服务在生产中运行。改变只会涉及在最后添加另一个常量。 我可以安全地这样做吗?
答案 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序列化来编码和解码枚举对象。
枚举的序列化按名称工作 - 即实际上它们正在发送枚举值的名称(以及其类的标识符)。只要实际发送的值在另一个接收方存在,就应该没有问题。
当然,您必须确保消息的含义不会因您的更改而改变。