實現java.io.Serializable 接口的類是可序列化的。沒有實現此接口的類將不能使它們的任一狀態被序列化或逆序列化。
序列化類的所有子類本身都是可序列化的。這個序列化接口沒有任何方法和域,僅用於標識序列化的語意。允許非序列化類的子類型序列化,子類型可以假定負責保存和恢復父類型的公有的、保護的和(如果可訪問)包的域的狀態。只要該類(擴展)有一個無參構造子,可初始化它的狀態,那麼子類型就可承擔上述職責。在這種情況下申明一個可序列化的類是一個錯誤。此錯誤將在運行時被檢測。就是可以把對象存到字節流,然後可以恢復!
例如:Integer實現了Serializable,所以可以把一個Integer的對象用IO寫到文件裡,之後再可以從文件裡讀出,如你開始寫入的時候那個對象的intValue() 是5的話,那讀出來之後也是5。這一點體現了用序化類的作用,即用來傳送類的對象。 所謂的Serializable,就是java提供的通用數據保存和讀取的接口。至於從什麼地方讀出來和保存到哪裡去都被隱藏在函數參數的背後了。這樣子,任何類型只要實現了Serializable接口,就可以被保存到文件中,或者作為數據流通過網絡發送到別的地方。也可以用管道來傳輸到系統的其他程序中。這樣子極大的簡化了類的設計。只要設計一個保存一個讀取功能就能解決上面說得所有問題。
Object serialization的定義: Object serialization 允許你將實現了Serializable接口的對象轉換為字節序列,這些字節序列可以被完全存儲以備以後重新生成原來的對象。 serialization不但可以在本機做,而且可以經由網絡操作(RMI)。這個好處是很大的----因為它自動屏蔽了操作系統的差異,字節順序(用Unix下的c開發過網絡編程的人應該知道這個概念)等。比如,在Window平台生成一個對象並序列化之,然後通過網絡傳到一台Unix機器上,然後可以在這台Unix機器上正確地重構這個對象。
Object serialization主要用來支持2種主要的特性: 1。Java的RMI(remote method invocation).RMI允許象在本機上一樣操作遠程機器上的對象。當發送消息給遠程對象時,就需要用到serializaiton機制來發送參數和接收返回直。
2。Java的JavaBeans. Bean的狀態信息通常是在設計時配置的。Bean的狀態信息必須被存起來,以便當程序運行時能恢復這些狀態信息。這也需要serializaiton機制。
二。sakulagi和rollingpig說的持久化我也說一下。 我覺得你們說的應該是英文裡的persistence.但是Java語言裡現在只支持lightweight persistence,就是輕量級持久化,這是通過serialization機制來實現的。
persistence是指一個對象的生命周期不由程序是否執行來決定,即使是在程序終止時這個對象也存在。它把一個serializable的對象寫到磁盤(本機或其他機器上的非RAM存儲器),並在程序重新調用時再讀取對象到通常的RAM存儲器。
為什麼說Java的serialization機制實現的是lightweight persistence?因為你必須顯式的序列化和反序列化程序裡的對象;而不是直接由一個關鍵詞來定義一個對象是序列化的然後由系統做相應的處理。
如下例子:
package com.hoobey.estore.domain;
import java.io.Serializable; import java.util.Date; import java.util.List;
public class Order implements Serializable {
private String id;
private double money;
private String receiverinfo;
private int paystate;
private Date orderTime;
private int user_id;
// 用於訂單查詢時,可以將用戶信息也封裝到Order中 private String username; private String nickname;
// 訂單中包含多個訂單項 private List<OrderItem> orderItems;
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public double getMoney() { return money; }
public void setMoney(double money) { this.money = money; }
public String getReceiverinfo() { return receiverinfo; }
public void setReceiverinfo(String receiverinfo) { this.receiverinfo = receiverinfo; }
public int getPaystate() { return paystate; }
public void setPaystate(int paystate) { this.paystate = paystate; }
public Date getOrderTime() { return orderTime; }
public void setOrderTime(Date orderTime) { this.orderTime = orderTime; }
public int getUser_id() { return user_id; }
public void setUser_id(int user_id) { this.user_id = user_id; }
public List<OrderItem> getOrderItems() { return orderItems; }
public void setOrderItems(List<OrderItem> orderItems) { this.orderItems = orderItems; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getNickname() { return nickname; }
public void setNickname(String nickname) { this.nickname = nickname; }
}