對象序列化到文本並讀取

import java.io.FileReader;
import java.io.FileWriter;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;
import java.io.EOFException ;
import java.io.Serializable;

public class Test2
{
    public static void main(String[] args)
    {
       testSerializaObject ();
       testReadSerializaObject ();
    }
    public static void testReadSerializaObject()
    {
       System. out .println( " 讀取了信息: " );
       ObjectInputStream ois = null ;
       FileInputStream fis = null ;
       SeriObject s = null ;
       try
       {
           fis = new FileInputStream( "C:/Object.txt" );
           ois = new ObjectInputStream(fis);
           boolean hasNext = true ;
           while (hasNext)
           {
              try
              {
                  s =  (SeriObject)ois.readObject(); 
                  if (s != null )
                     System. out .println( "SeriObject---" + s.toString());
              }
              catch (Exception ex)
              {
                  hasNext = false ;
              }
           }
       }
       catch (IOException ex)
       {
           ex.printStackTrace();
       }
       finally
       {
           if (ois != null )
           {
              try {ois.close();} catch (IOException e){e.getMessage();};
           }
           if (fis != null )
           {
              try {fis.close();} catch (IOException e){e.getMessage();};
           }
       }
    }

   
    public static void testSerializaObject()
    {
       System. out .println( " 向 Object.txt 文件寫入 Object..." );
       SeriObject s1 = new SeriObject();
       s1.setAge(20);
       s1.setName( "UserName1" );
       s1.setSex( "Girl" );
       SeriObject s2 = new SeriObject();
       s2.setAge(30);
       s2.setName( "UserName2" );       
       ObjectOutputStream oos = null ;    
       FileOutputStream fos = null ;

       try
       {
           fos = new FileOutputStream( "C:/Object.txt" , true );
           oos = new ObjectOutputStream(fos);
           oos.writeObject(s1);
           oos.writeObject(s2);
           System. out .println( "Object Write Successfully !" );
       }
       catch (IOException ex)
       {
           ex.getMessage();
       }
       finally
       {           
           if (oos != null )
           {
              try {oos.close();} catch (IOException e){e.getMessage();};
           }
           if (fos != null )
           {
              try {fos.close();} catch (IOException e){e.getMessage();};
           }
       }
    }
}
 

class SeriObject implements Serializable
{
    private int age ;
    private String name ;
    private transient String sex ;
    public int getAge()
    {
       return age ;
    }
    public void setAge( int age)
    {
       this . age = age;
    }
    public String getName()
    {
       return name ;
    }
    public void setName(String name)
    {
       this . name = name;
    }
    public String getSex()
    {
       return sex ;
    }
    public void setSex(String sex)
    {
       this . sex = sex;
    }
    public String toString()
    {
       return "Name:" + this . name + ";Sex:" + this . sex + ";Age:" + this . age + ";" ;
    }
}

 

結果如下:

讀取了信息:

SeriObject---Name:UserName1;Sex:null;Age:20;

SeriObject---Name:UserName2;Sex:null;Age:30;

---------------------------------------------------------------------------------------------------

序列化對象就比較好說啦,只要實現 Serializable 這個接口的類都可以序列化(事實是不是這樣沒去考究過),這個 SeriObject 就實現了,其中的 private transient String sex ; 這個表示,我不需要進行序列化傳輸,也就是說,這個 SeriObject 對象序列化保存在文本文件後, sex 這個屬性將不會被保存。(看結果 Sex 始終爲 null )

在這裏就序列化了兩個對象存進文本,但中間不能再寫入其它非 OBJECT 的東西,否則,讀取會出錯。

序列化後的文本讀取對象,在這裏使用了一個變量( hasNext )用來判斷是否還有對象沒有讀出來,當 ObjectInputStream 的 readObject 遇到錯誤( EOFException )的時候就將 hasNext 設爲 false ,網上有朋友是這樣說的,我也沒有找到更好的資料,所以就這樣挨着讀下去,有錯就當作是讀取完了。

這樣基本上就可以完成多個 OBJECT 的序列化到文本和讀取了。

當然當多個對象序列化到文本保存的時候呢,有朋友說還可以使用 LIST 把它給裝起來,然後將 LIST 扔進 文本里去,
但我不知 LIST 是否實現了 Serializable ,所以我想就算實現了也會用一個類來實現 Serializable ,在這個類裏面
加入 LIST ,用來裝其它對象。

有點疑問:如果一個文本里序列化了多個不同的對象,讀取的時候怎麼來呢?難不志一個一個的讀並還原回去?

序列化用處很多,比如說保存當前遊戲內容.


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/liushengmz/archive/2010/05/24/5620669.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章