java中的serializable_java中的Serializable接口的作用
實現(xiàn)java.io.Serializable 接口的類是可序列化的。沒有實現(xiàn)此接口的類將不能使它們的任一狀態(tài)被序列化或逆序列化。
序列化類的所有子類本身都是可序列化的。這個序列化接口沒有任何方法和域,僅用于標識序列化的語意。允許非序列化類的子類型序列化,子類型可以假定負責(zé)保存和恢復(fù)父類型的公有的、保護的和(如果可訪問)包的域的狀態(tài)。只要該類(擴展)有一個無參構(gòu)造子,可初始化它的狀態(tài),那么子類型就可承擔(dān)上述職責(zé)。在這種情況下申明一個可序列化的類是一個錯誤。此錯誤將在運行時被檢測。就是可以把對象存到字節(jié)流,然后可以恢復(fù)!
例如:Integer實現(xiàn)了Serializable,所以可以把一個Integer的對象用IO寫到文件里,之后再可以從文件里讀出,如你開始寫入的時候那個對象的intValue() 是5的話,那讀出來之后也是5。這一點體現(xiàn)了用序化類的作用,即用來傳送類的對象。?所謂的Serializable,就是java提供的通用數(shù)據(jù)保存和讀取的接口。至于從什么地方讀出來和保存到哪里去都被隱藏在函數(shù)參數(shù)的背后了。這樣子,任何類型只要實現(xiàn)了Serializable接口,就可以被保存到文件中,或者作為數(shù)據(jù)流通過網(wǎng)絡(luò)發(fā)送到別的地方。也可以用管道來傳輸?shù)较到y(tǒng)的其他程序中。這樣子極大的簡化了類的設(shè)計。只要設(shè)計一個保存一個讀取功能就能解決上面說得所有問題。
Object serialization的定義:?Object serialization 允許你將實現(xiàn)了Serializable接口的對象轉(zhuǎn)換為字節(jié)序列,這些字節(jié)序列可以被完全存儲以備以后重新生成原來的對象。serialization不但可以在本機做,而且可以經(jīng)由網(wǎng)絡(luò)操作(RMI)。這個好處是很大的----因為它自動屏蔽了操作系統(tǒng)的差異,字節(jié)順序(用Unix下的c開發(fā)過網(wǎng)絡(luò)編程的人應(yīng)該知道這個概念)等。比如,在Window平臺生成一個對象并序列化之,然后通過網(wǎng)絡(luò)傳到一臺Unix機器上,然后可以在這臺Unix機器上正確地重構(gòu)這個對象。
Object serialization主要用來支持2種主要的特性: 1。Java的RMI(remote method invocation).RMI允許象在本機上一樣操作遠程機器上的對象。當(dāng)發(fā)送消息給遠程對象時,就需要用到serializaiton機制來發(fā)送參數(shù)和接收返回直。
2。Java的JavaBeans. Bean的狀態(tài)信息通常是在設(shè)計時配置的。Bean的狀態(tài)信息必須被存起來,以便當(dāng)程序運行時能恢復(fù)這些狀態(tài)信息。這也需要serializaiton機制。
二。sakulagi和rollingpig說的持久化我也說一下。 我覺得你們說的應(yīng)該是英文里的persistence.但是Java語言里現(xiàn)在只支持lightweight persistence,就是輕量級持久化,這是通過serialization機制來實現(xiàn)的。
persistence是指一個對象的生命周期不由程序是否執(zhí)行來決定,即使是在程序終止時這個對象也存在。它把一個serializable的對象寫到磁盤(本機或其他機器上的非RAM存儲器),并在程序重新調(diào)用時再讀取對象到通常的RAM存儲器。
為什么說Java的serialization機制實現(xiàn)的是lightweight persistence?因為你必須顯式的序列化和反序列化程序里的對象;而不是直接由一個關(guān)鍵詞來定義一個對象是序列化的然后由系統(tǒng)做相應(yīng)的處理。
如下例子:
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 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 getOrderItems() { ??return orderItems; ?}
public void setOrderItems(List 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; ?}
}
總結(jié)
以上是生活随笔為你收集整理的java中的serializable_java中的Serializable接口的作用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java cmd找不到文件_cmd中输入
- 下一篇: java kafka client_Ka