2011-05-24 54 views
0

我的團隊通過jms向公司的另一個團隊提供服務。這涉及到作爲更大對象的一部分傳遞給我們的枚舉。他們很快就會改變enum的定義 - 不過,我想先改變它,以便我們可以在改變前的幾天讓我們的服務在生產環境中運行。這個變化只會在最後增加一個常量。 我可以安全地做到這一點嗎?jms和不同版本的枚舉

回答

3

Java Object Serialization Specification version 6.0(強調是礦):

枚舉常數的序列化形式由僅其名稱的; [...]。要序列化一個枚舉常量,ObjectOutputStream寫入由枚舉常量的name方法返回的值。要反序列化一個枚舉常量,ObjectInputStream從流中讀取常量名稱;通過調用java.lang.Enum.valueOf方法獲得反序列化的常量,並將常量的枚舉類型與接收的常量名稱一起作爲參數傳遞。

這意味着:

  • 添加新值enum向後兼容,當涉及到系列化
  • 重新排列現有enum向後兼容(以相反的默認JPA enum使用的持久性策略ordinal()
  • 刪除值從enum一般不是向後兼容,因爲拆除的值可能已被用於序列化目的
  • 重命名enum向後兼容(見上文)
1

如果我理解正確,包含枚舉的對象作爲ObjectMessage的一部分發送。如果是這種情況,它會使用通常的Java序列化來對枚舉對象進行編碼和解碼。

枚舉的序列化按名稱工作 - 即事實上它們正在發送枚舉值的名稱(連同其類的標識符)。只要實際發送的值在另一方接收方存在,應該沒有問題。

當然,您必須確保消息的含義不會因您的更改而改變。

+0

當然,托馬斯在我面前一分鐘回答,半小時後沒人回答。 (我首先必須下載JMS規範,看看它們是否真的在這裏使用序列化,它們的確如此,參見3.11節)。 – 2011-05-24 21:28:15