public class HClass implements Serializable { public HClass(){ } public HClass(String name, String city) { this.name = name; this.city = city; } }
主要的原因是因為存儲的內容可能會超出,然后就會存儲到內存中,要用的時候要序列化,所以這里繼承是為了有備無患;
這只是一種通俗易懂的說法,但要是想真正弄懂它,我們還需要了解什么是序列化?如何序列化?序列化的好處?用了序列化能干啥?
①什么是序列化;
簡單說就是為了保存在內存中的各種對象的狀態,並且可以把保存的對象狀態再讀出來。雖然你可以用你自己的各種各樣的方法來保存Object States,但是java給你提供一種應該比你自己好的保存對象狀態的機制,那就會序列化;換一種說法來說序列化就是一種用來處理對象流的機制。所謂對象流也就是將對象的內容進行流化,流的概念這里不用多說(就是I/O)。我們可以對流化后的對象進行讀寫操作,也可將流化后的對象傳輸於網絡之間(注:要想將對象傳輸於網絡必須進行流化)!在對對象流進行讀寫操作時會引發一些問題,而序列化機制正是用來解決這些問題的!
②什么情況下需要序列化;
1、當你想把的內存中的對象保存到一個文件中或者數據庫中時候;
2、當你想用序列化在網絡上傳送對象的時候;
3、當你想通過RMI傳輸對象的時候;
③如何序列化;
1、將需要被序列化的類實現Serializable接口,該接口沒有需要實現的方法,implements Serializable只是為了標注該對象是可被序列化的。然后使用一個輸出流(如:FileOutputStream)來構造一個
ObjectOutputStream(對象流)對象。接着,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數為obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。
// 經常使用如下: public static void main(String[] args) throws Exception { File file = new File("user.ser"); ObjectOutputStream oout = new ObjectOutputStream(new FileOutputStream(file)); User user = new User("zhang", 18, Gender.MALE); oout.writeObject(user); oout.close(); ObjectInputStream oin = new ObjectInputStream(new FileInputStream(file)); Object newUser = oin.readObject(); oin.close(); System.out.println(newUser); }
如沒有 實現Serializable接口,在序列化時,使用ObjectOutputStream的write(object)方法將對象保存時將會出現異常。其實 java.io.Serializable 只是一個沒有屬性和方法的空接口;
2、在序列化的過程中,有些數據字段我們不想將其序列化,對於此類字段我們只需要在定義時給它加上transient關鍵字即可,對於transient字段序列化機制會跳過不會將其寫入文件,當然也不可被恢復。但有時我們想將某一字段序列化,但它在SDK中的定義卻是不可序列化的類型,這樣的話我們也必須把他標注為transient,可是不能寫入又怎么恢復呢?好在序列化機制為包含
這種特殊問題的類提供了如下的方法定義:
private void readObject(ObjectInputStream in) throws
IOException, ClassNotFoundException;
private void writeObject(ObjectOutputStream out) throws
IOException;
(注:這些方法定義時必須是私有的,因為不需要你顯示調用,序列化機制會自動調用的)
使用以上方法我們可以手動對那些你又想序列化又不可以被序列化的數據字段進行寫出和讀入操作。
④序列化的好處;
把一個對象完全轉成字節序列,方便傳輸,而且java的序列化是可以完全還原的;