通过ObjectInputStream

时间:2017-10-17 02:04:54

标签: java serialization arraylist casting

我目前正在尝试通过序列化来保存和加载“Player”类的多个实例。 (这是作为fyi的作业)。

当前进程的工作方式是我通过ObjectOutputStream.writeObject(Player)运行该类,这似乎可以正常工作,因为我得到的文本文件似乎是类数据。

我目前遇到的问题是当我反向并加载类时,我无法将对象强制转换回一个玩家对象,它会抛出一个异常,但是我目前还没有足够的知识来弄清楚确切的例外。

请在下面找到功能。

保存功能:

public void savePlayers(ArrayList<Player> p)
{
    FileOutputStream fout = null;
    ObjectOutputStream oos = null;
    try
    {
        fout = new FileOutputStream("Player.txt");
        oos = new ObjectOutputStream(fout);
        for(Player player: p)
        {
          oos.writeObject(p);
        }
        fout.close();
        oos.close();
      }

    catch(Exception e)
    {
        System.out.println("Error is: " + e);
    }
    finally
    {
        closeStreams(fout, oos);
    }

}

加载功能:

public ArrayList<Player> loadPlayers() 
{   

    ArrayList<Player> loadedList = new ArrayList<Player>();

    FileInputStream fis;
    ObjectInputStream ois;

    try
    {
        fis = new FileInputStream("Player.txt");
        ois = new ObjectInputStream(fis);

       while(true)
       {
           System.out.println("Entered loop"); //testing
           Object obj = ois.readObject();
           System.out.println("Read object done"); //testing
           Player p = (Player)obj;
           System.out.println("Casted player"); //The line here doesn't run, prints out error from exception instead and exits loop
           loadedList.add(p);
           System.out.println("Loop iterated");
       }
    }
    catch(EOFException eof)
    {

    }
    catch(Exception e)
    {
           System.out.println("Exception here");
    }
}

有没有更好的方法来保存课程?我在演员时做错了什么?

1 个答案:

答案 0 :(得分:2)

更改为

oos.writeObject(player);

以及您多次编写整个ArrayList的时刻