java對象序列化機制一般來講有兩種用途
需要將對象的狀態保存到文件中
而後能夠通過讀入對象狀態來重新構造對象
恢復程序狀態
使用套接字在網絡上傳送對象的程序來說
是很有用的
我們通過讓類實現java
io
Serializable 接口可以將類序列化
這個接口是一個制造者(marker)接口
也就是說
對於要實現它的類來說
該接口不需要實現任何方法
它主要用來通知Java虛擬機(JVM)
需要將一個對象序列化
對於這個
有幾點我們需要明確
並非所有類都可以序列化
在cmd下
我們輸入serialver
socket
可以得到socket是否可序列化的信息
實際上socket是不可序列化的
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 );
}
}
}
還有可以通過套接字傳遞序列化對象
大概類似
看到這裡或許很多人都會有個疑問
是否所有的對象都可以序列化呢?
當然是不可以的了
至於為什麼不可以
那就有很多原因了
比如:
安全方面的原因
比如一個對象擁有private
public等field
對於一個要傳輸的對象
比如寫到文件
或者進行rmi傳輸等等
在序列化進行傳輸的過程中
這個對象的private等域是不受保護的
資源分配方面的原因
比如socket
thread類
如果可以序列化
進行傳輸或者保存
也無法對他們進行重新的資源分配
而且
也是沒有必要這樣實現
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25611.html