2013-06-22 2 views
1

Я пытаюсь написать ArrayList с различными объектами в нем в файл. Это мой 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 в файл под названием тест:

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) 

Я думал, что ArrayList реализует Serializable, так что я не знаю, почему NotSerializableException является Чет своя. Надеюсь, вы, ребята, видите, почему это исключение выбрано.

Уже спасибо!

ответ

2

Так как ваш ArrayList содержит Coach экземпляров, вы просто должны сделать Coach класса реализует java.io.Serializable (и, возможно, другой класс вы используете как Goalkeeper или Fielder).

Serializable Javadoc говорит:

When traversing a graph, an object may be encountered that does not support the Serializable interface. In this case the NotSerializableException will be thrown and will identify the class of the non-serializable object.

Тем не менее, способ сериализации работает в Java является довольно сложным. Для получения полной информации см. http://docs.oracle.com/javase/6/docs/platform/serialization/spec/serialTOC.html

1

ArrayList действительно сериализуется, но функция сериализации ArrayList также должна иметь возможность сериализовать все объекты в списке. Это означает, что все объекты в списке должны также реализовывать Serializable. В этом случае, по крайней мере, Coach не является сериализуемым (и, вероятно, так это не другие объекты в списке), и, таким образом, создается исключение.