为什么我得到异常java.io.NotSerializableException?

时间:2016-10-27 12:47:24

标签: java serialization

我收到以下代码的java.io.NotSerializableException:java.util.ArrayList $ SubList。

        ObjectInputStream os=new ObjectInputStream(new FileInputStream("AllEMExampleObjects.dat"));
        Set<EntitiyMentionExample> AllEMs=(Set<EntitiyMentionExample>)(os.readObject());
        EntitiyMentionExample[] AllExamples=AllEMs.toArray(new EntitiyMentionExample[0]);

        ObjectOutputStream oo=new ObjectOutputStream(new FileOutputStream("C:\\Users\\15232114\\workspace\\Year2\\FormatedExamples\\TestSerialization.dat"));
        oo.writeObject(AllExamples[0]);

显然,EntitiyMentionExample类是Serializable,这就是Set&lt;&gt;的原因。它已存储在dat文件(AllEMExampleObjects.dat)中。那为什么现在不存储它的单个实例呢?

1 个答案:

答案 0 :(得分:5)

只是ArrayList$SubList没有实现Serializable

检查source code

private class SubList extends AbstractList<E> implements RandomAccess {

AbstractListRandomAccess都没有实现(或延伸)SerializableSubList也没有。{/ p>

这是有道理的:序列化子列表 - 这是一个列表视图,意味着子列表的更新反映在原始列表中 - 您还必须序列化后备列表。但是,如果序列化和反序列化,对该实例的更改将不再反映为原始支持列表中的更新。

要序列化子列表,您需要先将其复制到自己的(可序列化)列表中:

List<T> copyOfSubList = new ArrayList<>(subList);