随笔-2  评论-0  文章-0  trackbacks-0
  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 阅读(1053) | 评论 (0)编辑 收藏