java核心學習(十七) IO架構---對象序列化

來源:互聯網
上載者:User

標籤:對象序列化   serial   java對象序列化   person   trace   相對   cts   tag   還原序列化   

一、使用物件流程實現序列化。

  先定義一個可序列化的對象

    

package com.shy.IO;import java.io.Serializable;public class Person implements Serializable{    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    private int age;    private String name;    public Person(String name , int age){        this.age = age;        this.name = name;    }}

  然後將Persen類的執行個體使用物件流程序列化


package com.shy.IO;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;public class WriteObject {    public static void main(String[] args) {        try (                ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("object.txt"));        ) {            Person person = new Person("yuyu", 22);            outputStream.writeObject(person);        } catch (IOException ioe) {            ioe.printStackTrace();        }    }}
 

  最後再還原序列化

package com.shy.IO;import java.io.FileInputStream;import java.io.IOException;import java.io.ObjectInputStream;public class ReadObject {    public static void main(String[] args) {        try (                ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("object.txt"))        ) {            Person person = (Person) inputStream.readObject();            System.out.println(person.getName()+"的年齡為"+person.getAge());        } catch (IOException ioe) {            ioe.printStackTrace();        } catch (ClassNotFoundException e) {            e.printStackTrace();        }finally {        }    }}
 

  由上面代碼可以看出,還原序列化時必須進行downcasting,而且還原序列化機制度區的僅僅是java對象的資料,而且沒有使用物件建構器,這表明還原序列化機制無需通過構造起來初始化java對象。

 

二、java對象序列化演算法內容簡介

  1、所有儲存到磁碟中的對象都有一個序列化編號。

  2、當程式試圖序列化一個對象時,程式會先檢查該對象是否被序列化過,只有該對象從未(在本次虛擬機器中)被序列化過,系統才會將對象轉化為位元組序列並輸出。

  3、如果某個對象已經序列化過,程式將只是直接輸出一個序列化編號,而不是再次重新序列化該對象。

 

三、自訂序列化

  對實現了Serializable介面的對象,可使用下列三種方式來自訂序列化與還原序列化。

  第一種方式,若在執行個體成員變數前面使用transient關鍵字修飾,可以指定java序列化時無需理會該執行個體變數;

  第二種方式,在需要序列化的類中提供如下特殊簽名的方法,在這些方法中分別對java對象的成員變數用out.writeObject()方法進行存取

  

private void writeObject(java.io.ObjectOutputStream out)throws IOException;    private void readObject(java.io.ObjectInputStream in)throws IOException,ClassNotFoundException;    private void readObjectNoData()throws ObjectStreamException;

  第三種方式,在序列化時將該對象替換成其他對象,此時應該為序列化提供如下方法,序列化機制會序列化該方法返回的對象。

    private Object writeReplace() throws ObjectStreamException;

  通過上面介紹,可以知道java序列化機制在將對象序列化寫入檔案之前,先調用被序列化對象的writeObject方法,然後再調用writeReplace方法,相對應的,在從檔案中讀取對象時的最後,會調用readObject方法,之後再調用readResolve方法,該方法和writeReplace方法很像,可以將源序列化對象轉換為另一個對象來返回,可以用來實現白虎幸福之整個對象。

四、另一種序列化機制,實現Externalizable介面

  與serializable這種聲明式介面不同,Externalizable介面裡面定義了兩個方法writeExternal() and readExternal()兩個方法,這兩個方法除了名字與writeObject和readObject不同外其他都相同,用處就是強制自訂序列化。

五、序列化的範圍

  對象的類名和執行個體變數都會被序列化,方法、類變數,transient變數都不會被序列化。

六、serialVersionUID

  在定義序列化對象時最好手動定義序列化對象的版本,也就是在序列化對象中定義一個靜態成員變數,private static fianl long serialVersionUID = 512L;用於保證class檔案改變之後還可以正確還原序列化。

java核心學習(十七) IO架構---對象序列化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.