域模型一定要實現Serializable介面嗎?
阿新 • • 發佈:2018-12-31
在Web應用的開發中,尤其實在前後端分離的情況下,伺服器端多半會將域模型以REST介面的方式提供給客戶端,於是我在很多WEB應用中,都看到這樣的程式碼:
public class ActionStatus implements Serializable {
private static final long serialVersionUID = -8633429564140080535L;
private final int code;
private final int message;
/**
* @param code
* @param message
*/
public ActionStatus(int code, int message) {
super();
this.code = code;
this.message = message;
}
/* 餘下的程式碼略 */
}
那麼問題來了,為什麼我們所有的域模型都要實現Serializable介面呢?
1. 將域模型轉換為JSON時需要序列化
將域模型轉換為JSON實際上就是將JAVA物件轉換為字串的過程,完全不需要任何序列化操作,無論時Jackson的ObjectMapper,還是google的Gson框架,都沒有要求轉換的物件必須實現序列化介面。
所以,雖然JAVA物件與JSON之間的互轉也涉及到序列化與飯序列化的概念,但與Serializable介面完全是兩個概念。
2. 資料儲存一定需要序列化
在JAVA EE 7規範中,域模型(@Entity)完全可以不用實現Serializable介面,資料儲存依舊可以順利進行,所以,序列化對資料儲存也不是必需的。
3. Serializable介面只是個標記介面,實不實現無所謂
強行實現Serializable介面,不僅不會對程式有任何幫助,很多時候還會起到相反的作用,例如加重了SOA框架的耦合性,降低了安全性、效能以及增加了程式版本相容的難度。
結論
實現Serializable介面在大部分的情況下都是不必要的,除非是以IIOP或這JRMP (RMI)協議 傳輸資料,或者需要將資料快取到有叢集的HTTP-Session中(因為需要保證Session的完整性,經常需要將Session序列化以便於備份與共享),再或者是將資料快取到本地檔案系統中。