我的團隊通過jms向公司的另一個團隊提供服務。這涉及到作爲更大對象的一部分傳遞給我們的枚舉。他們很快就會改變enum的定義 - 不過,我想先改變它,以便我們可以在改變前的幾天讓我們的服務在生產環境中運行。這個變化只會在最後增加一個常量。 我可以安全地做到這一點嗎?jms和不同版本的枚舉
0
A
回答
3
從Java Object Serialization Specification version 6.0(強調是礦):
枚舉常數的序列化形式由僅其名稱的; [...]。要序列化一個枚舉常量,
ObjectOutputStream
寫入由枚舉常量的name
方法返回的值。要反序列化一個枚舉常量,ObjectInputStream
從流中讀取常量名稱;通過調用java.lang.Enum.valueOf方法獲得反序列化的常量,並將常量的枚舉類型與接收的常量名稱一起作爲參數傳遞。
這意味着:
- 添加新值
enum
爲向後兼容,當涉及到系列化 - 重新排列現有
enum
值是向後兼容(以相反的默認JPAenum
使用的持久性策略ordinal()
) - 刪除值從
enum
一般不是向後兼容,因爲拆除的值可能已被用於序列化目的 - 重命名
enum
值不向後兼容(見上文)
1
如果我理解正確,包含枚舉的對象作爲ObjectMessage的一部分發送。如果是這種情況,它會使用通常的Java序列化來對枚舉對象進行編碼和解碼。
枚舉的序列化按名稱工作 - 即事實上它們正在發送枚舉值的名稱(連同其類的標識符)。只要實際發送的值在另一方接收方存在,應該沒有問題。
當然,您必須確保消息的含義不會因您的更改而改變。
相關問題
- 1. 維護本地C++枚舉和Java枚舉同步
- 2. C#:基於不同枚舉類型的枚舉值返回枚舉值
- 3. 枚舉apache目錄版本使用.net
- 4. Java的枚舉和PostgreSQL枚舉
- 5. 枚舉中的R不同的事件
- 6. 爪哇枚舉和Objective-C枚舉
- 7. C++和枚舉
- 8. ListView和枚舉
- 9. FluentNHibernate和枚舉
- 10. DataContractJsonSerializer和枚舉
- 11. NHibernate和枚舉
- 12. 移動枚舉到不同的裝配
- 13. 枚舉不同對象的NSArray
- 14. 基本枚舉的本地實例或傳遞枚舉集合?
- 15. 不能轉換UserQuery枚舉枚舉
- 16. 枚舉拋出「不是枚舉類型」
- 17. 帶枚舉的MySQL枚舉
- 18. Python的同時枚舉
- 19. 不從枚舉
- 20. ConcurrentDictionary更新和枚舉線程同步
- 21. 爲什麼@objc枚舉與純粹的Swift枚舉有不同的描述?
- 22. 從枚舉類型的隱式轉換「枚舉UIViewAnimationOption不同枚舉類型uiviewanimation過渡
- 23. 枚舉和常量
- 24. 枚舉和繼承
- 25. manage.py inspectdb和枚舉
- 26. 枚舉和註釋
- 27. 枚舉setter和getter
- 28. 當枚舉值不在枚舉中時賦予枚舉的默認值
- 29. SortedSet和SortedList失敗,具有不同的枚舉
- 30. Java枚舉找到枚舉
當然,托馬斯在我面前一分鐘回答,半小時後沒人回答。 (我首先必須下載JMS規範,看看它們是否真的在這裏使用序列化,它們的確如此,參見3.11節)。 – 2011-05-24 21:28:15