获取RuntimeException:Parcelable在写入parcel时遇到IOException

时间:2017-10-19 13:12:34

标签: java android

我尝试通过意图发送Parcelable数据,但我得到了:

java.lang.RuntimeException:Parcelable遇到IOException,编写可序列化对象(name = java.util.HashMap)

使用android parcelable生成器插件生成了parcelable类。 我相信hashmap不能以这种方式分配,那么解决方案是什么呢?

这是我的代码:

public class Menu extends Product implements Parcelable {
    private HashMap<Option,ArrayList<Article>> options = new HashMap<>();

    private int calories = 0;

    public Menu(String name, double price, String description, String pictureSrc){
        super(name,price,description,pictureSrc);
        for(Option option:Option.values()){
            ArrayList<Article> articles = new ArrayList<>();
            articles.add(new Article(""));
            articles.add(new Article("Choisir un article ..."));
            options.put(option,articles);
        }
    }

    public HashMap<Option,ArrayList<Article>> getOptions() {
        return options;
    }

    public void setOptions(HashMap<Option,ArrayList<Article>> options) {
        this.options = options;

        this.calories = 0;
        int i = 0;
        for(Option option:options.keySet()){
            for(Article article:options.get(i)){
                calories += article.getCalories();
            }
        }
    }

    public void addOption(Option option, Article article){
        article.addIncludedInMenu(this);
        if(options.containsKey(option))
            options.get(option).add(article);
        else{
            ArrayList<Article> articles = new ArrayList<>();
            articles.add(article);
            options.put(option,articles);
        }

        calories += article.getCalories();
    }

    public void removeOption(Option option, Article article){
        article.removeIncludedInMenu(this);
        this.options.get(option).remove(article);
        calories -= article.getCalories();
    }


    public int getCalories() {
        return calories;
    }

    @Override
    public boolean equals(Object obj) {
        return obj==this;
    }

    @Override
    public String toString() {
        return this.name;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
        dest.writeSerializable(this.options);
        dest.writeInt(this.calories);
    }

    protected Menu(Parcel in) {
        super(in);
        this.options = (HashMap<Option, ArrayList<Article>>) in.readSerializable();
        this.calories = in.readInt();
    }

    public static final Creator<Menu> CREATOR = new Creator<Menu>() {
        @Override
        public Menu createFromParcel(Parcel source) {
            return new Menu(source);
        }

        @Override
        public Menu[] newArray(int size) {
            return new Menu[size];
        }
    };

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

ArrayList已经实现了serializable。 所以,解决问题的另一个想法是: 使用选项作为额外名称传递ArrayLists,并且您需要在哪里,您可以再次迭代。

这样的事情:

final Bundle bundle = new Bundle();
for(Option option:Option.values()){
    ArrayList<Article> articles = new ArrayList<>();
    articles.add(new Article(""));
    articles.add(new Article("Choisir un article ..."));
    bundle.putSerializable(String.valueOf(option), articles);
}

然后,在接收意图的部分中,你可以

for(Option option:Option.values()){
   if (getIntent().hasExtra(String.valueOf(option))){
      ArrayList<Article> articles = getSerializableExtra(option);
      // add to your hashmap
   }
}