AndroidRuntime错误:包裹:无法编组值

Jar*_*red 95 java android

我正在尝试使用intent.puExtra函数将HashMap传递给新活动.单步执行调试器似乎它添加了HashMap没有问题,但是当调用startActivty()时,我得到一个运行时错误,指出Parcel:无法编组值com.appName.Liquor.

Liquor是我创建的一个自定义类,我相信它与HashMap结合使用会导致问题.如果我传递一个字符串而不是我的HashMap,它加载下一个活动没问题.

主要活动

lv.setOnItemClickListener(new OnItemClickListener() {
   public void onItemClick(AdapterView<?> parent, View view,
      int position, long id) {

      String cat = ((TextView) view).getText().toString();
      Intent i = new Intent(OhioLiquor.this, Category.class);
      i.putExtra("com.appName.cat", _liquorBase.GetMap());
      startActivity(i);
Run Code Online (Sandbox Code Playgroud)

酒类

public class Liquor
{
public String name;
public int code;
public String category;

private HashMap<String, Bottle> _bottles;

public Liquor()
{
    _bottles = new HashMap<String, Bottle>();
}

public void AddBottle(Bottle aBottle)
{
    _bottles.put(aBottle.size, aBottle);
}
}
Run Code Online (Sandbox Code Playgroud)

子活动

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    HashMap<Integer, Liquor> map = (HashMap<Integer, Liquor>)getIntent().getSerializableExtra("com.appName.cat");

    setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, GetNames(map)));

    ListView lv = getListView();
    lv.setTextFilterEnabled(true);
Run Code Online (Sandbox Code Playgroud)

当存在运行时错误时,它永远不会进入子活动类.所以我很确定在向意图添加HashMap时存在问题,并且根据错误我认为我的Liquor类是原因,但我无法弄清楚原因.

非常感谢您的帮助.谢谢!

nai*_*kus 248

HashMap自己是可序列化的,但Bottle类是否可序列化?如果没有,它将不会序列化并在运行时抛出错误.使Bottle类实现java.io.Serializable接口

  • 白酒总是要责怪:)) (162认同)
  • 谢谢,我不得不为Liquor和Bottle类添加工具Serializable. (4认同)
  • 为我工作:) (3认同)
  • 无论如何都不应该责怪酒 (3认同)
  • 它的工作原理..我必须在Bottle类中实现Serializable.谢谢@naikus (2认同)
  • 它有效,但我很困惑序列化与此有什么关系?Android 是否会定期序列化和反序列化对象?在什么情况下我需要实现 Serializable 接口(就像这里)? (2认同)

Zoh*_*Ali 5

我收到此错误是因为我的班级不是Serializable. 为了使我的类可序列化,我必须: Serializable在类末尾添加以使其可序列化。像这样

class Shirt(val price: Double, val discountedPrice: Double) : Serializable
Run Code Online (Sandbox Code Playgroud)

确保Serializable像这样导入

import java.io.Serializable
Run Code Online (Sandbox Code Playgroud)