2017-03-22 5 views
0

オブジェクトのArrayListを保存してもう一度読むために、次のコードがあります。しかし、それは動作しません、読み取りは空に見えます。どのようにそれを解決するには?ファイルからarraylistをロードするときにオブジェクトが空になる

詳細:POINodeはseraserableを実装しています。データが正確に保存されているように見えます。 arraylistは静的ではありません。

// 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

ファイルは空ですか?例外がスローされますか? –

+0

デバッガを使用して学習する必要があります。それは時間と時間を節約します。そのリストに*が書かれているかどうかチェックしてください。書き込み時にファイルが何であるかを確認します。読んでいるときにファイルが何であるかを確認してください。読んだ後にリストに含まれる内容を確認してください。これらすべての質問に明確な答えがある場合にのみ質問してください。 「読み込みが空白になっている」とはあまりにもあいまいであり、投稿したコードは問題を再現できるとは限りません。 –

+0

例外はありませんが正常に動作します。始まりはPOINodeのdescritionのように見え、いくつかのコード化されたデータです。クリアテキストデータではありません。いくつかKBがあります...それはうまく書いているようです。 – bruno

答えて

0

問題は継承された変数です。それはクラスとしてシリアライズ可能ではありませんでした。元のライブラリを拡張しました。

関連する問題