Java 将具有不同对象的arraylist写入文件

Java 将具有不同对象的arraylist写入文件,java,serialization,arraylist,writetofile,Java,Serialization,Arraylist,Writetofile,我正在尝试将包含不同对象的ArrayList写入一个文件。这是我的ArrayList: ArrayList<Person> personList = new ArrayList<Person>(); private Person theCaptain; void init(){ //Adding persons to the list personList.add(new Coach("Tesan de Boer", "Vierus

我正在尝试将包含不同对象的ArrayList写入一个文件。这是我的ArrayList:

ArrayList<Person> personList = new ArrayList<Person>();
    private Person theCaptain;


    void init(){

    //Adding persons to the list

    personList.add(new Coach("Tesan de Boer", "Vieruslaan 3b", "0689337554"));
    personList.add(new Goalkeeper("Peter Post", "Eeuwige student 66", "2222", 1));
    personList.add(new Goalkeeper("piet puk", "Weg van ongenade 88", "2222", 21));
    personList.add(new Goalkeeper("Siem van Aanhoolt", "Straatweg 45", " 0612213446", 31));
    personList.add(new Fielder("Koen Weegink", "Straatweg 45", "2222", 2));
    personList.add(new Fielder("Jan-Willem Rufus op den Haar", "Straatweg 45", " 0614226698", 3));
    personList.add(new Fielder("Tom Kraniker", "Straatweg 45", "069873663", 4));
    personList.add(new Fielder("Leon het Kanon", "Straatweg 45", "2222", 6));
    personList.add(new Fielder("Robin Hogezant", "Straatweg 45", "2222", 7));
    personList.add(new Fielder("Loesoe de Kat", "Straatweg 45", "222", 8));
    personList.add(new Fielder("Morris de Spee", "Straatweg 45", "2222", 9));
    personList.add(new Fielder("Rein Zoekers", "Straatweg 45", "2222", 10));
    personList.add(new Fielder("Darion Pok", "Straatweg 45", "2222", 11));
    personList.add(new Fielder("Achmed de Bom", "Straatweg 45", "2222", 12)); 

    }
我认为ArrayList实现了Serializable,所以我不知道为什么会抛出NotSerializableException。我希望你们明白为什么会抛出这个异常


已经谢谢了

ArrayList
确实是可序列化的,但是
ArrayList
的序列化函数还需要能够序列化列表中的所有对象。这意味着列表中的所有对象也必须实现
Serializable

在这种情况下,至少
Coach
不可序列化(列表中的其他对象可能也不可序列化),因此会引发异常

由于您的
ArrayList
包含
Coach
实例,因此您只需使
Coach
类实现
java.io.Serializable
(可能还有您正在使用的其他类,如
守门员
Fielder

报告说:

在遍历图形时,可能会遇到不支持序列化接口的对象。在这种情况下,将抛出NotSerializableException并标识不可序列化对象的类

不过,Java中序列化的工作方式相当复杂。有关完整信息,请参阅

public class Main {

public static void main(String[] args)throws Exception {

    Team team = new Team();
    team.init();
    ArrayList<Person> playersData = team.getPersonList();

    try {

       // create a new file with an ObjectOutputStream
       FileOutputStream out = new FileOutputStream("test.txt");
       ObjectOutputStream oout = new ObjectOutputStream(out);

       // write something in the file
       oout.writeObject(playersData);

       // close the stream
       oout.close();

       // create an ObjectInputStream for the file we created before
       ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.txt"));



    } catch (Exception ex) {
       ex.printStackTrace();
    }

}
java.io.NotSerializableException: Coach
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.ArrayList.writeObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at Main.main(Main.java:24)