【问题标题】:Unable to Serialize Hashmap ,java.io.NotSerializableException无法序列化哈希图,java.io.NotSerializableException
【发布时间】:2017-07-19 20:23:44
【问题描述】:
public class Common implements Serializable{

    private static HashMap<Integer,List<LevelList>> levelListMap = new HashMap<>();

    public static Map<Integer, List<LevelList>> getLevelListMap(Context context) {

        File file = new File(context.getDir("data", MODE_PRIVATE), "map");
        ObjectInputStream inputStream = null;
        try {
            inputStream = new ObjectInputStream(new FileInputStream(file));
            levelListMap = (HashMap<Integer, List<LevelList>>) inputStream.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return levelListMap;
    } ...
}

我无法序列化 hashmap。我不断收到java.io.NotSerializableException for levelListMap = (HashMap&lt;Integer, List&lt;LevelList&gt;&gt;) inputStream.readObject();

public class LevelList implements Serializable{

    public int id;
    public String title;
    public String imgurl;
    public String songurl;
    public String songtext;
    boolean isFavourite;

    public void release() {

    }


    public void setFavourite(boolean favourite) {
        isFavourite = favourite;
    }

    public boolean isFavourite(){
        return isFavourite;
    }

}

【问题讨论】:

  • 请添加堆栈跟踪。
  • 你在序列化的时候一定遇到了完全相同的异常,你一定是忽略了它。不要那样做。

标签: java android


【解决方案1】:

HashMap 是可序列化的,但键和值也必须是可序列化的。确保所有键和值都是可序列化的,并且它们的字段也是可序列化的(不包括瞬态和静态成员)。

编辑:

HashMap&lt;Integer,List&lt;LevelList&gt;&gt;,您的List 实现是否可序列化?

【讨论】:

  • 是的,我正在使用 ArrayList。如果我将 HashMap> 更改为 HashMap> 会有帮助吗?
  • @sreejithvs 不,如果你让LevelList 实现Serializable 会有所帮助。清除您在进行序列化时没有这样做,显然您当时忽略了相同的异常。
【解决方案2】:

查看此链接How to serialize a list in Java。 List 的标准实现,即 ArrayList、LinkedList 等是可序列化的。

如果您将您的 List 声明为 List 子类型之一,例如 ArrayList&lt;LevelList&gt; levelList = new ArrayList&lt;LevelList&gt;();,那么它应该可以开箱即用地序列化。否则,您将需要以安全的方式进行转换,例如按照该答案线程中Theodore Murdock 的建议使用&lt;T extends List&lt;Foo&gt; &amp; Serializable&gt; setFooList(T list) 设置List 实现。

【讨论】:

  • “它们需要首先被强制转换为 Serializable 类型”——该语句不正确,因为 Serializable 类型检查是在运行时完成的
  • @SteveKuo 我将继续修改该声明,感谢您指出这一点。
猜你喜欢
  • 2015-03-13
  • 2013-06-25
  • 2014-02-21
  • 2013-04-17
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多