簡體   English   中英

Java序列化-java.lang.ClassCastException錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM