2015-06-20 56 views
2

我有一个复杂的对象(其中包含更多对象和hashmaps)。所有对象都实现了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

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

或者我应该实现单例类吗?

+0

'getIntent()'返回的是'myobject'额外添加的相同意图吗? – CKing

+0

@ChetanKinger它应该。应用程序中没有其他地方可以打开第二个活动。 –

回答

1

你正在做的都很好,所以我认为可能是:

  • 您要发送到secondActivity方法的不正确的对象(如ArrayList,而不是正确的MyObject的)
  • 请看,如果你正在使用这个关键字“myobject”在代码的其他部分,并在putExtra中设置其他对象。

  • 验证的MyObject类看,如果一些变量是一个ArrayList和删除它(只是为了测试)

  • 您的自定义对象没有“实现Serializable”,如:

    公共类MyObject来实现Serializable {

    //变量和方法

    }

所以,我建议你验证一下,我认为最好使用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; 

}

我firt活动:

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:我不太会说英语,所以对此表示歉意。

0
  • 有一些普遍准则,为什么有些对象是不是 序列化

  • 实在是太紧密联系在一起的本地代码(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

相关问题