2006年11月9日
转自:
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;
}
}
posted @
2006-11-09 12:22 a3mao 阅读(389) |
评论 (0) |
编辑 收藏
接口 java.io.Serializable
- public interface Serializable
实现 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 中。
posted @
2006-11-09 12:12 a3mao 阅读(1051) |
评论 (0) |
编辑 收藏