前言
Java實體對象為什么一定要實現Serializable接口呢?在學JavaSE的時候有些實體對象不實現Serializable不是也沒什么影響嗎?
最近在學習mybatis的時候發現,老師寫的實體對象都實現了Serializable接口,我查了查網上說是實現Serilizable接口是為了序列化
先來看下Serializable接口
Serializable是java.io包中定義的、用於實現Java類的序列化操作而提供的一個語義級別的接口。Serializable序列化接口沒有任何方法或者字段,只是用於標識可序列化的語義。實現了Serializable接口的類可以被ObjectOutputStream轉換為字節流,同時也可以通過ObjectInputStream再將其解析為對象。例如,我們可以將序列化對象寫入文件后,再次從文件中讀取它並反序列化成對象,也就是說,可以使用表示對象及其數據的類型信息和字節在內存中重新創建對象。而Java作為一門面向對象的編程語言,對象作為其主要數據的類型載體,為了完成對象數據的讀寫操作,也就需要一種方式來讓JVM知道在進行IO操作時如何將對象數據轉換為字節流,以及如何將字節流數據轉換為特定的對象,而Serializable接口就承擔了這樣一個角色。
實現序列化的兩個原因
1、將對象的狀態保存在存儲媒體中以便可以在以后重新創建出完全相同的副本;2、按值將對象從一個應用程序域發送至另一個應用程序域。實現serializabel接口的作用是就是可以把對象存到字節流,然后可以恢復,所以你想如果你的對象沒實現序列化怎么才能進行持久化和網絡傳輸呢,要持久化和網絡傳輸就得轉為字節流,所以在分布式應用中及設計數據持久化的場景中,你就得實現序列化。
是不是每個實體bean都要實現序列化
答案其實還要回歸到第一個問題,那就是你的bean是否需要持久化存儲媒體中以及是否需要傳輸給另一個應用,沒有的話就不需要,例如我們利用fastjson將實體類轉化成json字符串時,並不涉及到轉化為字節流,所以其實跟序列化沒有關系。
下面我們可以通過例子來實現將序列化的對象存儲到文件,然后再將其從文件中反序列化為對象,代碼示例如下:
先定義一個序列化對象User:
public class User implements Serializable { private static final long serialVersionUID = 1L; private String userId; private String userName; public User(String userId, String userName) { this.userId = userId; this.userName = userName; } }
然后我們編寫測試類,來對該對象進行讀寫操作,我們先測試將該對象寫入一個文件:
public class SerializableTest { /** * 將User對象作為文本寫入磁盤 */ public static void writeObj() { User user = new User("1001", "Joe"); try { ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("/Users/guanliyuan/user.txt")); objectOutputStream.writeObject(user); objectOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String args[]) { writeObj(); } }
這是正常實現serializabel的測試,運行程序,看到對象數據以二進制文本的方式被持久化到了磁盤文件中。在進行反序列化測試之前,我們可以嘗試下將User實現Serializable接口的代碼部分去掉,看看此時寫操作是否還能成功
結果拋出了NotSerializableException異常,提示非可序列化異常,也就是說沒有實現Serializable接口的對象是無法通過IO操作持久化的。說明在Java中如何要實現對象的IO讀寫操作,都必須實現Serializable接口,否則代碼就會報錯!
轉載自:https://www.cnblogs.com/hhhshct/p/9664390.html
https://developer.51cto.com/art/201905/596334.htm###