问题描述
|
我的团队通过jms为公司中的另一个团队提供服务。这涉及到一个枚举,该枚举作为较大对象的一部分传递给我们。他们很快将更改枚举的定义-但是,我想先更改它,以便在更改前几天将我们的服务投入生产。更改将只涉及在末尾添加另一个常量。
我可以安全地这样做吗?
解决方法
从Java Object Serialization Specification 6.0版开始(重点是我的):
枚举常量的序列化形式仅由其名称组成; [...]。要序列化枚举常量,
ObjectOutputStream
写入由枚举常量的name
方法返回的值。要反序列化枚举常量,ObjectInputStream
从流中读取常量名称;然后,通过调用java.lang.Enum.valueOf方法,将常量的枚举类型与接收到的常量名称一起作为参数来获取反序列化的常量。
这意味着:
在序列化中向enum
添加新值是向后兼容的
对现有enum
值进行重新排序是向后兼容的(与使用ordinal()
的默认JPAenum
持久性策略相反)
从ѭ3中删除值通常不向后兼容,因为删除的值可能已用于序列化目的
重命名enum
值不向下兼容(请参见上文)
,如果我理解正确,则包含枚举的对象将作为ObjectMessage的一部分发送。在这种情况下,它使用常规的Java序列化对枚举对象进行编码和解码。
枚举的序列化按名称进行-实际上,它们正在发送枚举值的名称(连同其类的标识符)。只要实际发送的值存在于另一接收方,就不会有问题。
当然,您必须确保消息的含义不会因更改而改变。