从Android通过Intent反序列化Serializable对象时,发生ClassNotFoundException

时间:2018-10-23 14:27:49

标签: java android serialization serializable

我有两个Android应用程序A和B。对于应用程序A。我有一个可序列化的对象

public class MyObject implements Serializable {
public String[] var1;
public ArrayList<Integer> var2;

public MyObject (String[] var1, ArrayList<Integer> var2) {
    this.var1= var1;
    this.var2= var2;
}

然后,我通过使用Intent将此类的实例发送到App B中的另一个活动

Intent i= new Intent("appB.component");
i.putExtra("myobject", fc);
startActivity(i);

在应用B中,我在应用A中创建了相同的可序列化类。我尝试获取此类,但得到java.lang.RuntimeException: Parcelable encountered ClassNotFoundException reading a Serializable object (name = appA.MyObject )

Bundle b = getIntent().getExtras();               
MyObject o = (MyObject) b.getSerializable("myobject");

我们是否可以将应用程序A中的类的引用更改为应用程序B,还是在不修改应用程序A中的代码的情况下以手动方式解析该对象。

1 个答案:

答案 0 :(得分:0)

appA.MyObjectappB.MyObject不是同一类。 一个不能反序列化为另一个。

最好使用GSON或类似的库将appA.MyObject类序列化为JSON,通过Intent发送结果字符串,然后将JSON字符串反序列化回appB.MyObject课。

或者,您可以尝试同时给appA.MyObjectappB.MyObject一个

private static final long serialVersionUID

字段,并将两个UID设置为相同的值。但我不确定是否可行。

Android Serializable documentation的忠告:

  

明智地实现可序列化

     

有关序列化API的全面介绍,请参见有效Java的序列化一章。本书介绍了如何使用此界面而不损害应用程序的可维护性。

     

推荐的替代方法

     

JSON简洁,易读且高效。 Android包含用于读写JSON的流API和树API。使用GSON之类的绑定库直接读写Java对象。