java對象序列化機制一般來講有兩種用途:
1.需要將對象的狀態保存到文件中,而後能夠通過讀入對象狀態來重新構造對象,恢復程序狀態
2.使用套接字在網絡上傳送對象的程序來說,是很有用的。
我們通過讓類實現java.io.Serializable 接口可以將類序列化。這個接口是一個製造者(marker)接口。也就是說,對於要實現它的類來說,該接口不需要實現任何方法。它主要用來通知Java虛擬機(JVM),需要將一個對象序列化。
對於這個,有幾點我們需要明確:
1.並非所有類都可以序列化,在cmd下,我們輸入serialver java.net.socket,可以得到socket是否可序列化的信息,實際上socket是不可序列化的。
2.java有很多基礎類已經實現了serializable接口,比如string,vector等。但是比如hashtable就沒有實現serializable接口。
將對象讀出或者寫入流的主要類有兩個: ObjectOutputStream與ObjectInputStream 。ObjectOutputStream 提供用來將對象寫入輸出流的writeObject方法, ObjectInputStream提供從輸入流中讀出對象的readObject方法。使用這些方法的對象必須已經被序列化的。也就是說,必須已經實現Serializable接口。如果你想writeobject一個hashtable對象,那麼,會得到一個異常。
下面舉個例子:
import java.io.*;
public class testser implements Serializable {
public int ii;
testser() {
}
testser( int param ) {
ii = param;
}
}
testser是一個實現了serializable接口的類。
讀寫這個序列化過的類:
import java.io.*;
public class Ser {
private static String datafile;
datafile="ser.data";
public static void main( String[] argv ) {
System.out.println( "Java Serialization Demo." );
SerData data;
try {
ObjectInputStream in = new ObjectInputStream( new FileInputStream( datafile ));
data = (SerData) in.readObject();
in.close();
}
catch (Exception e) {
data = new testser();
}
System.out.println( "Original data: ii = " + data.ii );
data.ii++;
try {
ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream( datafile ) );
out.writeObject( data );
out.flush();
out.close();
}
catch (Exception e) {
System.out.println( e );
}
}
}
還有可以通過套接字傳遞序列化對象,大概類似,不再贅述。