2015-07-11 57 views
1

我需要關於兼容性更改和serialVersionUID(http://docs.oracle.com/javase/6/docs/platform/serialization/spec/version.html#6678)的建議。兼容更改和serialversionUID

我使用'client'項目與使用RPC的'server'項目進行通信的系統上工作('server'使用DTO類從數據庫導出數據,'client'使用相同的DTO類來呈現數據。

當在DTO類中添加一個字段時,團隊決定不更改serialversionUID,所以當部署新版本的'server'時,'client'不需要立即部署,因爲舊版本的DTO類與新的兼容。但是(因爲我們有兩個項目都有幾十個系統實例),如果在新版本的DTO類中部署了新版本的'客戶端',而由於某種原因'服務器'仍然保留在舊版本中,那麼DTO類的新字段將解析爲null,並且將作爲null呈現給客戶,這可能不正確。

有沒有解決這個問題的最佳實踐?我們可以在DTO類的任何類型的更改上更改UID,但是隨後我們將始終不得不同時部署兩個項目,即使未使用更改也是如此,並且我們正試圖避免這種情況...

回答

0

更改UID不是解決方案,它是問題的一部分。不要這樣做。

當您添加新字段時,還可以將邏輯添加到同一類的readObject()方法中,以便在其爲空時爲其提供合理的默認值。

+0

謝謝,會嘗試,但我不知道默認值是否會有所幫助。拋出一個異常是理想的,但只有當序列化類被反序列化爲新的版本時(例如,當序列化的新字段不存在時)。是否有一種簡單的方法來檢測反序列化過程中字段是否存在於流中,還是一直會解析爲null? – Uros

+0

你爲什麼要拋出異常?這不是一個動態的條件。從部署的狀態來看,新領域是否存在是完全可預測的。 – EJP

+0

這兩個應用程序都有30多個實例,並且有時必須在服務器應用程序之前部署客戶端應用程序。我知道這是一個不同的問題,但現在是這樣。我認爲最好給出一些「維護中」的消息,而不是給用戶提供錯誤的值(例如,如果該字段不存在,布爾型字段將被設置爲false)。 – Uros