【问题标题】:Saving and loading an Arraylist of classes via ObjectInputStream通过 ObjectInputStream 保存和加载类的 Arraylist
【发布时间】:2017-10-17 02:04:54
【问题描述】:

我目前正在尝试通过序列化保存和加载“播放器”类型的多个实例。 (这是一个作为参考的任务)。

该过程当前的工作方式是我通过 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");
    }
}

有没有更好的方法来保存课程?铸造时我做错了吗?

【问题讨论】:

  • 为什么不打印实际的错误消息并查看它的内容?
  • 播放器是如何定义的?也不要默默吞下异常
  • 哎呀!老师输入了那个来查看错误来自哪里,我忘了更改它,它带有: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException:australianopen.GameController。将不得不通过该课程进行搜索并弄清楚发生了什么
  • 播放器在自己的类中定义,实现可序列化,包含播放器的arraylist包含在另一个类中,然后通过上述函数传递该arraylist。

标签: java serialization arraylist casting


【解决方案1】:

改成

oos.writeObject(player);

当您多次编写整个 ArrayList 时

【讨论】:

  • 谢谢!我现在没有收到异常或错误,希望我能修复剩下的意大利面并最终加载一些玩家!
猜你喜欢
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 2019-12-07
  • 2023-04-09
  • 2019-02-15
相关资源
最近更新 更多