java中的介面Serializable的作用和例子
作用:
沒有implements Serializable,你就不能通過rmi(包括ejb)提供遠程調用。
serialization 允許你將實現了Serializable介面的對象轉換為位元組序列,這些位元組序列可以被完全儲存以備以後重建原來的對象。
serialization不但可以在本機做,而且可以經由網路操作(就是貓小說的RMI)。這個好處是很大的----因為它自動屏蔽了作業系統的差異,位元組順序等。比如,在Window平台產生一個對象並序列化之,然後通過網路傳到一台Unix機器上,然後可以在這台Unix機器上正確地重構這個對象。
Object serialization主要用來支援2種主要的特性:
1。Java的RMI(remote method invocation).RMI允許象在本機上一樣操作遠程機器上的對象。當發送訊息給遠程對象時,就需要用到serializaiton機制來發送參數和接收返回直。
2。Java的JavaBeans. Bean的狀態資訊通常是在設計時配置的。Bean的狀態資訊必須被存起來,以便當程式運行時能恢複這些狀態資訊。這也需要serializaiton機制。
總之如果在網路的環境下做類傳輸,應該還是implements Serializable。
例子:
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.ServerSocket;
import java.net.Socket;
//定義序列化(object)
class Student implements Serializable {
private int sno;
private String sname;
public Student(int sno, String sname) {
this.sno = sno;
this.sname = sname;
}
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
@Override
public String toString() {
return "學號:" + sno + ";姓名:" + sname;
}
}
//(object)的還原序列化過程
class MyClient extends Thread {
@Override
public void run() {
try {
Socket s = new Socket("localhost", 9999);
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
Student stu = (Student) ois.readObject();
System.out.println("用戶端程式收到伺服器端程式傳輸過來的學生對象>> " + stu);
ois.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//(object)的序列化過程
class MyServer extends Thread {
@Override
public void run() {
try {
ServerSocket ss = new ServerSocket(9999);
Socket s = ss.accept();
ObjectOutputStream ops = new ObjectOutputStream(s.getOutputStream());
Student stu = new Student(1, "趙本山");
ops.writeObject(stu);
ops.close();
s.close();
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//測試
public class TestTransfer {
public static void main(String[] args) {
new MyServer().start();
new MyClient().start();
}
}
參照這個例子就會很好的理解Serializable介面的用法和作用了。