2016-10-27 4 views
-1

Ich erhalte java.io.NotSerializableException: java.util.ArrayList $ SubList für den folgenden Code.Warum bekomme ich die Ausnahme java.io.NotSerializableException?

 ObjectInputStream os=new ObjectInputStream(new FileInputStream("AllEMExampleObjects.dat")); 
     Set<EntitiyMentionExample> AllEMs=(Set<EntitiyMentionExample>)(os.readObject()); 
     EntitiyMentionExample[] AllExamples=AllEMs.toArray(new EntitiyMentionExample[0]); 

     ObjectOutputStream oo=new ObjectOutputStream(new FileOutputStream("C:\\Users\\15232114\\workspace\\Year2\\FormatedExamples\\TestSerialization.dat")); 
     oo.writeObject(AllExamples[0]); 

Offensichtlich ist die Klasse EntitiyMentionExample ist Serializable, deshalb ist ein Set <> davon bereits in dat-Datei (AllEMExampleObjects.dat) gespeichert ist. Warum speichert es dann nicht eine einzige Instanz davon?

+1

Zeigen Sie uns die komplette Stacktrace. –

+0

Schalten Sie die Debug-Informationen für die erweiterte Serialisierung ein: http://StackOverflow.com/a/1660583/3788176. –

+0

java.io.NotSerializableException: java.util.ArrayList $ SUBLIST \t bei java.io.ObjectOutputStream.writeObject0 (Unknown Source) \t bei java.io.ObjectOutputStream.defaultWriteFields (Unknown Source) \t bei java.io.ObjectOutputStream .writeSerialData (Unknown Source) \t bei java.io.ObjectOutputStream.writeOrdinaryObject (Unknown Source) \t bei java.io.ObjectOutputStream.writeObject0 (Unknown Source) \t bei java.io.ObjectOutputStream.writeObject (Unknown Source) \t bei TrainingDataSetFormulator.main (TrainingDataSetFormulator.java:22) –

Antwort

4

Es ist einfach, dass ArrayList$SubListSerializable nicht implementiert.

Überprüfen Sie die source code:

private class SubList extends AbstractList<E> implements RandomAccess { 

Weder AbstractList noch RandomAccess implementieren (oder erweitern) Serializable, so auch nicht SubList.

Und das macht Sinn: Um eine Unterliste zu serialisieren - das ist eine Ansicht einer Liste, was bedeutet, dass Aktualisierungen der Unterliste in der ursprünglichen Liste widergespiegelt werden - müssen Sie auch die Sicherungsliste serialisieren. Wenn Sie jedoch serialisieren und deserialisieren, werden Änderungen an dieser Instanz nicht mehr als Aktualisierungen in der ursprünglichen Sicherungsliste angezeigt.

eine Unterliste serialisieren, müssen Sie es in seine eigene (serializable) Liste kopieren zuerst:

List<T> copyOfSubList = new ArrayList<>(subList); 
Verwandte Themen