2017-03-22 6 views
0

Ich habe den folgenden Code, um eine ArrayList eines Objekts zu speichern und dann erneut zu lesen. Es funktioniert jedoch nicht, der Lesevorgang ist leer. Wie man es löst?Leere Objekte beim Laden von Arraylist aus Datei

Einige Details: POInode implementiert seriazable; Sieht so aus, als wären die Daten korrekt gespeichert. Die Arraylist ist nicht statisch;

// READ & Write Class: 

public GlobalWriteAndLoadPositions(){ 
} 
public void write(String folder, List<POInode> POIlist) throws IOException { 

    int nextFileItarator = (int) Files.list(Paths.get(folder)).count(); 
    nextFileItarator++; 
    FileOutputStream fout= new FileOutputStream(folder + nextFileItarator + ".txt"); 

    ObjectOutputStream oos = new ObjectOutputStream(fout);  
    oos.writeObject(POIlist); 
    oos.close(); 

    // the next line shows the arraylist full of objects and the File looks fine. (non-clear text file, but full of data) 
    POIlist.forEach((a)->System.out.print("POI " + a.ID + " @ (" + a.getPosition().xCoord +" , " + a.getPosition().yCoord + ") | ")); 
    System.out.println("\n"); 
} 


@SuppressWarnings("unchecked") 
public ArrayList<POInode> load(String file) throws IOException, ClassNotFoundException{ 

    FileInputStream fin = new FileInputStream(file); 
    ObjectInputStream ois = new ObjectInputStream(fin); 
    List<POInode> listOfLoadedPOIs = new ArrayList<POInode>(); 

    listOfLoadedPOIs = (ArrayList<POInode>) ois.readObject(); // THIS LOOK WRONG, I MEAN,it is my guess 

    ois.close();  

    // the following command shows the correct size list, but empty values! 
    listOfLoadedPOIs.forEach((a)->System.out.print("POI " + a.ID + " @ (" + a.getPosition().xCoord +" , " + a.getPosition().yCoord + ") | ")); 
    System.out.println("\n"); 

    return (ArrayList<POInode>) listOfLoadedPOIs; 
} 

//Class usage: 

if (Global.shouldSavePoiDistribution){ 

     List<POInode> listOfPOIs = new ArrayList<POInode>(); 
     for(Node n : Runtime.nodes) { 
      if (n instanceof POInode){ 
       listOfPOIs.add((POInode) n);      
      } 
     } 

     GlobalWriteAndLoadPositions saver = new GlobalWriteAndLoadPositions(); 
     saver.write(Global.distributionFolder,listOfPOIs); 
    } 

// lets load a distribution IFF asked to 
if (Global.shouldLoadPoiDistribution){ 

    GlobalWriteAndLoadPositions loader = new GlobalWriteAndLoadPositions(); 
    try { 
     Global.listOfLoadedPOIs = loader.load(Global.distributionFile); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
} 
+0

ist die Datei leer? irgendwelche Ausnahmen geworfen werden? –

+0

Sie müssen lernen, einen Debugger zu verwenden. Das spart dir Stunden und Stunden. Überprüfen Sie, was die Liste enthält * bevor * es geschrieben ist. Überprüfen Sie beim Schreiben, was die Datei ist. Überprüfen Sie, was die Datei beim Lesen ist. Überprüfen Sie, was die Liste nach dem Lesen enthält. Stellen Sie nur eine Frage, wenn Sie klare Antworten auf all diese Fragen haben. "Die gelesen wird leer angezeigt" ist viel zu vage, und es gibt keine Möglichkeit mit dem Code, den Sie gebucht haben, dass wir das Problem reproduzieren können. –

+0

Keine Ausnahmen, läuft gut. Der Anfang sieht wie POInode-Beschreibung aus und einige kodierte Daten. Es sind keine klaren Textdaten. Es gibt einige KB ... Sieht gut aus. – bruno

Antwort

0

Das Problem ist die vererbte Variable. Es war nicht serialisierbar wie die Klasse. Ich habe die ursprüngliche Bibliothek erweitert.

Verwandte Themen