轉自:
http://www.j2medev.com/code/j2se/language/200602/1343.html
import?
java.io.FileInputStream;
import?
java.io.FileOutputStream;
import?
java.io.ObjectInputStream;
import?
java.io.ObjectOutputStream;
import?
java.io.Serializable;
public?class?
CardReader?
{
??
public?static?
void?
main
(
String
[]?
args
)?{
????
Card3?card?=?
new?
Card3
(
12
,?Card3.SPADES
)
;
????
System.out.println
(
"Card?to?write?is:?"?
+?card
)
;
????
try?
{
??????
FileOutputStream?out?=?
new?
FileOutputStream
(
"card.out"
)
;
??????
ObjectOutputStream?oos?=?
new?
ObjectOutputStream
(
out
)
;
??????
oos.writeObject
(
card
)
;
??????
oos.flush
()
;
????
}?
catch?
(
Exception?e
)?{
??????
System.out.println
(
"Problem?serializing:?"?
+?e
)
;
????
}
????
Card3?acard?=?
null
;
????
try?
{
??????
FileInputStream?in?=?
new?
FileInputStream
(
"card.out"
)
;
??????
ObjectInputStream?ois?=?
new?
ObjectInputStream
(
in
)
;
??????
acard?=?
(
Card3
)?(
ois.readObject
())
;
????
}?
catch?
(
Exception?e
)?{
??????
System.out.println
(
"Problem?serializing:?"?
+?e
)
;
????
}
????
System.out.println
(
"Card?read?is:?"?
+?acard
)
;
??
}
}
class?
Card3?
implements?
Serializable?
{
??
private?
int?
suit?=?UNASSIGNED;
??
private?
int?
number?=?UNASSIGNED;
??
public?final?static?
int?
UNASSIGNED?=?-
1
;
??
public?final?static?
int?
DIAMONDS?=?
1
;
??
public?final?static?
int?
CLUBS?=?
2
;
??
public?final?static?
int?
HEARTS?=?
3
;
??
public?final?static?
int?
SPADES?=?
4
;
??
public?final?static?
int?
ACE?=?
1
;
??
public?final?static?
int?
KING?=?
13
;
??
public?
Card3
(
int?
number,?
int?
suit
)?{
????
if?
(
isValidNumber
(
number
))?{
??????
this
.number?=?number;
????
}?
else?
{
??????
//Error
????
}
????
if?
(
isValidSuit
(
suit
))?{
??????
this
.suit?=?suit;
????
}?
else?
{
??????
//Error
????
}
??
}
??
public?
int?
getSuit
()?{
????
return?
suit;
??
}
??
public?
int?
getNumber
()?{
????
return?
number;
??
}
??
public?static?
boolean?
isValidNumber
(
int?
number
)?{
????
if?
(
number?>=?ACE?&&?number?<=?KING
)?{
??????
return?true
;
????
}?
else?
{
??????
return?false
;
????
}
??
}
??
public?static?
boolean?
isValidSuit
(
int?
suit
)?{
????
if?
(
suit?>=?DIAMONDS?&&?suit?<=?SPADES
)?{
??????
return?true
;
????
}?
else?
{
??????
return?false
;
????
}
??
}
??
public?
boolean?
equals
(
Object?obj
)?{
????
if?
(
obj?
instanceof?
Card3
)?{
??????
Card3?card?=?
(
Card3
)?
obj;
??????
if?
(
card.getNumber
()?
==?
this
.number?&&?card.getSuit
()?
==?
this
.suit
)?{
????????
return?true
;
??????
}?
else?
{
????????
return?false
;
??????
}
????
}?
else?
{
??????
return?false
;
????
}
??
}
??
public?
int?
hashCode
()?{
????
return?
number?*?suit;
??
}
??
public?
String?toString
()?{
????
return?
numberToString
(
this
.number
)?
+?
"?of?"?
+?suitToString
(
this
.suit
)
;
??
}
??
public?static?
String?numberToString
(
int?
number
)?{
????
String?result?=?
""
;
????
switch?
(
number
)?{
????
case?
ACE:
??????
result?=?
"Ace"
;
??????
break
;
????
case?
2
:
??????
result?=?
"Two"
;
??????
break
;
????
case?
3
:
??????
result?=?
"Three"
;
??????
break
;
????
case?
4
:
??????
result?=?
"Four"
;
??????
break
;
????
case?
5
:
??????
result?=?
"Five"
;
??????
break
;
????
case?
6
:
??????
result?=?
"Six"
;
??????
break
;
????
case?
7
:
??????
result?=?
"Seven"
;
??????
break
;
????
case?
8
:
??????
result?=?
"Eight"
;
??????
break
;
????
case?
9
:
??????
result?=?
"Nine"
;
??????
break
;
????
case?
10
:
??????
result?=?
"Ten"
;
??????
break
;
????
case?
11
:
??????
result?=?
"Jack"
;
??????
break
;
????
case?
12
:
??????
result?=?
"Queen"
;
??????
break
;
????
case?
KING:
??????
result?=?
"King"
;
??????
break
;
????
case?
UNASSIGNED:
??????
result?=?
"Invalid?Number"
;
??????
break
;
????
}
????
return?
result;
??
}
??
public?static?
String?suitToString
(
int?
suit
)?{
????
String?result?=?
""
;
????
switch?
(
suit
)?{
????
case?
DIAMONDS:
??????
result?=?
"Diamonds"
;
??????
break
;
????
case?
CLUBS:
??????
result?=?
"Clubs"
;
??????
break
;
????
case?
HEARTS:
??????
result?=?
"Hearts"
;
??????
break
;
????
case?
SPADES:
??????
result?=?
"Spades"
;
??????
break
;
????
case?
UNASSIGNED:
??????
result?=?
"Invalid?Suit"
;
??????
break
;
????
}
????
return?
result;
??
}
}
實現 java.io.Serializable 接口的類是可序列化的。沒有實現此接口的類將不能使它們的任一狀態被序列化或逆序列化。序列化類的所有子類本身都是可序列化的。這個序列化接口沒有任何方法和域,僅用于標識序列化的語意。
允許非序列化類的子類型序列化,子類型可以假定負責保存和恢復父類型的公有的、保護的和(如果可訪問)包的域的狀態。只要該類(擴展)有一個無參構造子,可初始化它的狀態,那么子類型就可承擔上述職責。在這種情況下申明一個可序列化的類是一個錯誤。此錯誤將在運行時被檢測。
在逆序列化期間,將使用非序列化類的公用的或保護的無參構造子對它的域進行初始化。可序列化子類必須能訪問父類的無參構造子。它的所有域將從相應流中被恢復。
當遍歷一個圖象時,很可能遇到一個不支持序列化接口的對象。此時將拋出 NotSerializableException 異常,且標識該非序列化對象類。
在序列化處理過程中需要特定句柄的類,必須使用如下這些恰當的標記實現特定的方法:
private void writeObject(java.io.ObjectOutputStream out) throws IOException private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
writeObject 方法負責寫特定類的對象的狀態,以至相應的 readObject 方法能恢復它。 通過調用 out.defaultWriteObject 可激活保存對象域的缺省機制。此方法不必關心狀態是屬于它的父類還是子類。 使用 writeObject 方法或基本類型支持的 DataOutput 方法將每個域的狀態保存到 ObjectOutputStream 中。
readObject 方法負責從此流中讀取并恢復類的域。它可能調用 in.defaultReadObject 方法來調用該對象的非靜態和非暫時的域的缺省恢復機制。 defaultReadObject 方法使用該流中的信息,用當前對象中的已命名域分配保存在流中該對象的相應域。當類已改進增加了新域時,這個接口也做相應處理。此方法不必關心狀態是屬于它的父類還是子類。 使用 writeObject 方法或基本類型支持的 DataOutput 方法將每個域的狀態保存到 ObjectOutputStream 中。