「每日分享」Java序列化技術即將被廢除

點擊上方"java全棧技術"關注,每天學習一個java知識點

什麼是序列化

我們的對象並不只是存在內存中,還需要傳輸網絡,或者保存起來下次再加載出來用,所以需要Java序列化技術。

Java序列化技術正是將對象轉變成一串由二進制字節組成的數組,可以通過將二進制數據保存到磁盤或者傳輸網絡,磁盤或者網絡接收者可以在對象的屬類的模板上來反序列化類的對象,達到對象持久化的目的。

如何序列化一個對象

要序列化一個對象,這個對象所在類就必須實現Java序列化的接口:java.io.Serializable。

序列化/反序列化

可以藉助commons-lang3工具包裡面的類實現對象的序列化及反序列化。

「每日分享」Java序列化技術即將被廢除

輸出:

User{username='Java', address='China'}

上例通過序列化對象字節到內存然後反序列化,當然裡面也提供了序列化磁盤然後再反序列化的方法,原理都是一樣的,只是目標地不一樣。

序列化注意事項

  • 序列化對象必須實現序列化接口。
  • 序列化對象裡面的屬性是對象的話也要實現序列化接口。
  • 類的對象序列化後,類的序列化ID不能輕易修改,不然反序列化會失敗。
  • 類的對象序列化後,類的屬性有增加或者刪除不會影響序列化,只是值會丟失。
  • 如果父類序列化了,子類會繼承父類的序列化,子類無需添加序列化接口。
  • 如果父類沒有序列化,子類序列化了,子類中的屬性能正常序列化,但父類的屬性會丟失,不能序列化。
  • 用Java序列化的二進制字節數據只能由Java反序列化,不能被其他語言反序列化。如果要進行前後端或者不同語言之間的交互一般需要將對象轉變成Json/Xml通用格式的數據,再恢復原來的對象。
  • 如果某個字段不想序列化,在該字段前加上transient關鍵字即可。

目前 Oracle 公司計劃廢除 Java 中的古董--序列化技術,因為它帶來了許多嚴重的安全問題(如序列化存儲安全、反序列化安全、傳輸安全等),據統計,至少有3分之1的漏洞是序列化帶來的,這也是 1997 年誕生序列化技術的一個巨大錯誤。

「每日分享」Java序列化技術即將被廢除

如圖所示,序列化技術現在在 Java 應用中無處不在,特別是現在的持久化框架和分佈式技術中,都需要利用序列化來傳輸對象,如:Hibernate、Mybatis、Java RMI、Dubbo等,即對象要存儲或者傳輸都不可避免要用到序列化技術,所以刪除序列化技術將是一個長期的計劃。

據悉,在未來的 Java 版本中,將會有一個迷你序列化框架來替代現在的古董序列化技術。這個新框架將會支持開發者值入序列化引擎,並支持如 JSON、XML 格式,以一個更安全的方式來序列化對象。

序列化技術自 Java 誕生到現在已經發展了 20 來年了,但並未有什麼改進和突破。也因為其簡單易用的方式,給 Java 應用程序帶來了許多安全漏洞。現在 Oracle 版本發佈越來越快,讓我們在新的版本中能看到更多序列化技術演進吧!

文章摘自java技術棧


分享到:


相關文章: