对象序列化到文本并读取

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值