[英]Java serialization - java.lang.ClassCastException Error
我有一個可序列化的StorageImpl類。 此類具有內部類Record 。
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 Long key;
private List<T> dataList;
檢索記錄后,就可以將所有書籍放入記錄的bookList成員中。
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();
}
}
}
更新:
請注意,我只想保留一個Record而不是List 。
代碼更改后的錯誤看起來與Record無法序列化有關:
引起原因:java.io.NotSerializableException:
atjava.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at StorageImpl.writeData(StorageImpl..java:159)
這是第159行的writeData()內部的調用
oos.writeObject(record);
看起來您正在從文件中讀取整個列表,但將其強制轉換為單個Record
。
要加載包含Record
對象的ArrayList
,您需要Record
可序列化,但是您仍在加載整個ArrayList
,因此recordList
轉換是不正確的(即,您可以將結果直接存儲到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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.