2016-07-21 9 views
0

Ich habe eine StorageImpl Klasse, die serialisierbar ist. Diese Klasse hat eine innere Klasse Record.Java-Serialisierung - java.lang.ClassCastException Fehler

public class StorageImpl <ID, T extends IDataStore<ID>> implements IStorage <T, ID> 
{ 

    private class Record implements Serializable 
    { 
     private static final long serialVersionUID = 1L; 

     private Long key; 
     private List<T> dataList; 

     private Record() 
     { 
      key  = new Long(0); 
      dataList = new ArrayList<T>(); 
     } 
    } 
} 

ich speichern möchten und rufen Sie eine Rekord wiederum die

private Long key; 
private List<T> dataList; 

hat Sobald ich einen Rekord abrufen, kann ich alle Bücher in booklist Mitglied der Bilanz bekommen.

public class StorageImpl <ID, T extends IDataStore<ID>> implements IStorage <T, ID> 
{ 
    private class Record implements Serializable 
    { 
     private static final long serialVersionUID = 1L; 

     private Long key; 
     private List<T> dataList; 

     private Record() 
     { 
      key  = new Long(0); 
      dataList = new ArrayList<T>(); 
     } 

    private String dataFile; 
    private Record record; 

    public StorageImpl(String dataFile) 
    { 
     this.dataFile = dataFile; 
     record  = new Record(); 
    } 


    public List<T> retrieve() throws Exception 
    { 
     List<T> dataList = new ArrayList<>(); 

     File file = new File(dataFile); 

     if (!file.exists()) 
     { 
      return dataList; 
     }   

     try (FileInputStream fis = new FileInputStream(dataFile); ObjectInputStream ois = new ObjectInputStream(fis)) 
     { 
      record = (Record) ois.readObject(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (ClassNotFoundException e) 
     { 
      e.printStackTrace(); 
     } 

     for (int i = 0; i < record.dataList.size(); i++) 
     { 
      dataList.add(record.dataList.get(i)); 
     } 

     return dataList; 
    } 
    @SuppressWarnings("unchecked") 
    @Override 
    public void store(T t) throws Exception 
    { 
     List<T> dataList = retrieve(); 

     ++record.key;   
     t.setID((ID) record.key); 
     dataList.add(t); 

     record.dataList = dataList; 
       writeData(record); 
    } 
    private void writeData(Record record) 
    { 
     try (FileOutputStream fos = new FileOutputStream(dataFile); 
      ObjectOutputStream oos = new ObjectOutputStream(fos)) 
     { 
      oos.writeObject(record); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

Update:

Bitte beachten Sie, ich nur ein Bilanz und keine Liste bestehen bleiben soll.

Der Fehler nach Änderungen am Code sieht aus wie auf Bilanz bezieht nicht serialisierbar sein:

Verursacht durch: java.io.NotSerializableException:

atjava.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) 
at StorageImpl.writeData(StorageImpl..java:159) 

Und das ist der Anruf innerhalb writedata() bei Linie 159

oos.writeObject(record); 

Antwort

1

es ist wie Sie die ganze Liste sieht aus der Datei lesen, aber Gießen es eine einzige 01 zu sein.

ein ArrayList enthalten Record Objekte, die Sie Record müssen laden serializable sein, aber du bist immer noch die gesamten ArrayList geladen, so dass die Besetzung nicht korrekt ist (das heißt speichern Sie können nur das Ergebnis direkt in recordList).

List<Record> recordList = new ArrayList<>(); 

try (FileInputStream fis = new FileInputStream(dataFile); ObjectInputStream ois = new ObjectInputStream(fis)) 
{ 
    recordList = (List<Record>) ois.readObject(); 
} 
catch (IOException e) 
{ 
    e.printStackTrace(); 
} 
catch (ClassNotFoundException e) 
{ 
    e.printStackTrace(); 
} 
+0

Aber ich möchte nicht persistieren oder eine Liste von Datensätzen lesen ** Liste **. Ich möchte beharren oder nur einen ** Record ** lesen, der wiederum einen Schlüssel und eine Liste aller Bücher in diesem Fall enthält. Sobald ich einen ** Rekord ** erhalte, kann ich alle Bücher in ** bookList ** Mitglied des ** Datensatzes ** bekommen. Ich werde meine Frage aktualisieren. –

+0

Ah, okay. Ich denke, der Kern des Problems ist immer noch der gleiche, in dem Sie eine Liste gespeichert haben. Also, wenn das erwartete Verhalten ist, dass Sie einen Datensatz lesen sollten, dann ist das Problem wahrscheinlich bei Ihrem Geschäftsanruf, denn das ist, denke ich, speichert nur die Liste. – gus

+0

Danke. Laut Ihrem Feedback habe ich meine Frage mit weiteren Details aktualisiert. Wenn Sie die Chance haben, es noch einmal zu überprüfen, würde das sehr geschätzt werden. –