【问题标题】:Invalid cast when passing serializable object to activity将可序列化对象传递给活动时的无效转换
【发布时间】:2015-06-20 18:45:18
【问题描述】:

我有一个复杂的对象(其中包括更多对象和哈希图)。所有对象都实现Serializable

在我做的第一个活动中:

public void secondActivity(MyObject o) {
    Intent intent = new Intent(this, SecondActivity.class);
    intent.putExtra("myobject", o);

    startActivity(intent);
    finish();
} 

然后,在我正在做的第二个活动中:

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

    Intent intent = getIntent();
    MyObject o = (MyObject)intent.getSerializableExtra("myobject");
}

但是在投射时我遇到了这个异常:

java.lang.ClassCastException: java.util.ArrayList 无法转换为 myapp.MyObject

这是在活动之间传递复杂对象的正确方法吗?我错过了什么?

或者我应该实现单例类?

【问题讨论】:

  • getIntent() 是否返回与添加 myobject extra 相同的意图?
  • @ChetanKinger 它应该。应用程序中没有其他地方可以打开第二个活动。

标签: java android serialization


【解决方案1】:

你做得很好,所以我认为可以:

  • 您正在向 secondActivity 方法发送一个不正确的对象(例如 ArrayList 而不是正确的 MyObject)
  • 请查看您是否在代码的其他部分使用此键“myobject”并在 putExtra 中设置其他对象。

  • 验证 MyObject 类并查看某个变量是否为 ArrayList 并将其删除(只是为了测试)

  • 您的自定义对象没有“实现可序列化”,例如:

    公共类 MyObject 实现可序列化 {

    //变量和方法

    }

所以,我建议您验证这一点,我认为最好使用 Singleton 类或 Parcelable 而不是 Serializable,因为 Google 表示根据 Good Practice 这样做更好。 请看这个答案stackoverflow

我制作了一些应用程序并实现了可序列化,我的自定义对象是:

public class Stores implements Serializable {
private static final long serialVersionUID = 1L;
public Integer id;
public String name;
public String store_hours;
public String telephone;
public String fax;
public String latitude;
public String longitude;

}

我的第一个活动:

private void showDialog(Stores store)
    {
        Intent intent = new Intent(this,DisplayDialogActivity.class);
        intent.putExtra("Locations",store);
        startActivityForResult(intent, 0);
    }

还有我的第二个活动

Stores store = (Stores) getIntent().getSerializableExtra("Locations");

PD:我不太会说英语,所以为此道歉。

【讨论】:

    【解决方案2】:
    • 有一些一般准则可以说明为什么某些对象不是 可序列化

    • 它与本机代码 (java.util.zip.Deflater) 的联系过于紧密。

    • 对象的状态取决于虚拟机的内部或 运行时环境,因此可能会因运行而异
      (java.lang.Thread, java.io.InputStream, java.io.FileDescriptor,
      java.awt.PrintJob)。

    • 该类主要是静态方法的持有者,没有任何真正的 内部状态(java.beans.Beans、java.lang.Math)。

    • 该类是非静态内部类。序列化不起作用 与非静态内部类很好。 (静态内部类没有 正在序列化的问题。)

    • 替代序列化格式在特定的 语境。 (XOM 节点类是不可序列化的,因为适当的 XML 的序列化格式是 XML。)

    确保您的课程已公开

    完整参考 . Java I/O 2nd Edition

    【讨论】:

      猜你喜欢
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 2011-08-26
      相关资源
      最近更新 更多