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);
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. –
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
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. –